1. 程式人生 > >java中的synchronize(修飾方法)

java中的synchronize(修飾方法)

        Synchronize對方法的修飾可分為對一般方法的修飾和對靜態方法的修飾,首先看Synchronize對一般方法的修飾。

        Synchronize對一般方法的修飾和對程式碼塊的修飾沒有什麼區別,對程式碼塊的修飾作用範圍是Synchronize(this){ // 作用範圍},大括號中的程式碼是作用範圍,而對方法修飾的作用範圍就是整個方法。如果把程式碼塊中的程式碼提出來作為一個方法二者沒有什麼本質上的區別。

        將上篇部落格中的例子修改為如下:(不同之處為將Synchronize原先只對for迴圈修改為對整個run方法的修飾)

<span style="font-size:18px;">public synchronized void run() {
   for (int i = 0; i < 5; i++) {
      try {
        System.out.println(Thread.currentThread().getName() + ":" +(count++));
         Thread.sleep(1000);
      } catch(InterruptedException e) {
         e.printStackTrace();
      }
   }
}</span>

         執行結果和對只修飾程式碼塊的結果是一樣的。

        除了對一般方法修飾Synchronize還可以對靜態方法進行修飾,我們知道類中的靜態方法是屬於所有例項化的物件的,可以推斷如果Synchronize修飾一個靜態方法那麼該類所有例項化出來的物件對這個方法都是執行緒同步的。通過如下的例項驗證:

<span style="font-size:18px;">public class SyncThread implementsRunnable{
     private static int count;
     public SyncThread() {
         count = 0;
     }
     public synchronized static void test() {     
          for (int i = 0; i < 5; i++) {
              try {
                    System.out.println(Thread.currentThread().getName() + ":" +(count++));
                    Thread.sleep(1000);
               } catch (InterruptedException e) {
                     e.printStackTrace();
              }
          }                       
      }
      public void run() {
            test();
      }
      public int getCount() {
                 return count;
       }
 
         publicstatic void main(String[] args){
                   SyncThreadsyncThread1 = new SyncThread();
                   SyncThreadsyncThread2 = new SyncThread();
                   Threadthread1 = new Thread(syncThread1, "SyncThread1");
                   Threadthread2 = new Thread(syncThread2, "SyncThread2");
                   thread1.start();
                   thread2.start();
         }
}</span>

結果展示:


結果分析:

       本次雖然也是例項化的兩個執行緒類,但是執行的結果卻和只有一個執行緒例項類是一樣的,因為在run中呼叫的是test這個靜態的方法,這個方法時屬於所有的物件,所以即使例項化的三個執行緒類,它們還是保持同步的。

小結:

      1、  定義介面方法是不能夠使用Synchronize

      2、  類的構造方法不可以使用

      3、  Synchronize不能繼承