2012-11-27 47 views
1

我感到困惑與以下情形所有的時間Java的同步,並通過多線程使用靜態同步方法

只有一個MyClass的對象,並有兩個線程T1,T2。 現在有一個線程說T2將能夠使用具有唯一MyClass對象鎖定的同步方法m1(),並且如果它嘗試訪問m1(),則其他線程T2將被阻塞。

現在我的感覺是,如果T2將嘗試通過訪問靜態共享字段訪問靜態同步方法m2(),它將被阻塞,因爲當前對象鎖定與T1並且將不能夠執行m2(),如果有Myclass然後T2線程的兩個對象將能夠訪問m1()。我正確或錯誤?

class MyClass 
{ 

      public static int i = 5; 

     public synchronized void m1() 
     { 
       System.out.println(i); //uses static field i of MyClass 
      //T1 is executing this method 
     } 

      public static synchronized void m3() 
      { 
       //T2 will be able to call this method on same object lock while it is using 
       //static field i??? 
       System.out.println(i);//uses static field i of MyClass 
      } 
} 

這很混亂請幫忙。提前致謝。

回答

6

現在,我的看法是,如果T2將試圖訪問非同步的方法M2(),它會被封鎖作爲當前對象鎖與T1

m2()不同步,因此有沒有什麼可以阻止它。這是同步方法和非同步方法之間的區別。

當一個線程嘗試輸入同步方法時,它會阻塞,直到它可以獲取適當的監視器(鎖定)。它將在退出該方法時釋放該鎖。對於非同步方法,這些步驟都不會發生。

(順便說一句,我個人建議不要使用synchronized方法可言,在大多數情況下,相反,內同步的方法,在引用這是只有知道這個類中,這使得它更容易推理代碼,因爲只有你的班級將能夠獲得該鎖。)

6

不正確。由於m2不是​​無論線程​​方法m1的狀態如何,在嘗試調用線程時都不會阻塞線程。

獲取對象的鎖定不會阻止對該對象的訪問,它只會阻止另一個線程同時獲取同一對象上的鎖定的能力。如果另一個線程不嘗試獲取該鎖,它將不會被阻止。

1

線程在進入同步方法/塊時獲取鎖。因爲m2()不同步,它將由線程2執行。請記住,只有在有同步方法時鎖纔會進入畫面

2

你錯了。對象不被​​塊「鎖定」,唯一發生的是其他​​塊試圖獲取該對象的監視器必須等待。

總結起來:​​對非同步代碼絕對沒有阻塞效應。