2014-11-02 124 views
0

我有一個關於同步靜態方法的問題。
如果我調用一個同步的靜態方法,這是否意味着我鎖定這個類和其他方法(包括靜態或無靜態)不能訪問同步靜態方法結束之前?調用synchronized靜態方法,那麼可以訪問其他靜態方法嗎?

當同步的靜態方法是鎖定類對象時,爲什麼其他靜態方法可以同時被調用?

class Y { 
    static synchronized void staticSleep() { 
     System.out.println("Start static sleep"); 
     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException e) { 
     } 
     System.out.println("End static sleep"); 
    } 
    static void staticSleepNoSyn() { 
     System.out.println("Start static NoSyn sleep"); 
     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException e) { 
     } 
     System.out.println("End static NoSyn sleep"); 
    } 
} 

public class X { 
    public static void main(String[] args) { 
     for (int i = 0; i < 2; ++i) { 
      new Thread(new Runnable() { 

       public void run() { 
        Y.staticSleep(); 
       } 
      }).start(); 
     } 

     for (int i = 0; i < 10; ++i) { 
      new Thread(new Runnable() { 

       public void run() { 
        Y.staticSleepNoSyn(); 
       } 
      }).start(); 
     } 
    } 
} 

輸出:

開始靜態睡眠
開始靜態NoSyn睡覺
開始靜態NoSyn睡覺
開始靜態NoSyn睡眠
開始靜態NoSyn睡覺
開始靜態NoSyn睡覺
開始靜態NoSyn睡眠
啓動靜態NoSyn睡覺
開始靜態NoSyn睡覺
開始靜態NoSyn睡覺
開始靜態NoSyn睡眠
結束靜態睡眠
開始靜態睡眠
結束靜態NoSyn睡覺
結束靜態NoSyn睡覺
結束靜態NoSyn睡眠
結束靜態NoSyn睡眠
結束靜態NoSyn睡覺
結束靜態NoSyn睡覺
尾靜態NoSyn睡眠
結束靜態NoSyn睡覺
結束靜態NoSyn睡覺
結束靜態NoSyn睡覺
結束靜態睡眠

+0

一個靜態同步'方法鎖定類的'Class'對象聲明靜態方法。你的問題的答案直接源於此。 – 2014-11-02 10:35:43

+0

當同步的靜態方法是鎖定類對象時,爲什麼其他靜態方法可以同時被調用? – wmmj23 2014-11-02 11:18:13

+0

如果2個方法是同一個類的方法,那麼它不能。 – 2014-11-02 11:31:42

回答

1

我看你現在是問。

如果我調用一個同步靜態方法,是否意味着我鎖定這個類,並且其他方法(包括靜態或無靜態)無法在同步靜態方法結束之前訪問?

如果這兩個方法都​​或使用​​塊,他們是同樣的事情同步(即在同一Class或相同this,那麼你會得到相互排斥。

在你的榜樣,一種方法不是​​(並且它不使用​​塊),因此它不會被鎖定。實際上,沒有任何東西會鎖定staticSleepNoSyn ......因爲您已經寫入了它

+0

我明白了。 'synchronized'不能限制no'synchronized'謝謝〜 – wmmj23 2014-11-02 12:39:09

相關問題