2011-02-12 145 views
3

假設我有下面的代碼段多線程與線程佔先同步

public synchronized void method() 
{ 
    if(something == null) 
    { 
     something = new SomeThing(); 
    } 
    //do something 
} 

現在,在多線程環境中假設,一個線程[線程1]進入方法,它執行後只是搶佔new Something();但然後才能將其分配給something。然後另一個線程[線程2]也嘗試調用該方法。現在究竟發生了什麼?線程1獲得的鎖定會發生什麼?線程1的步驟是否會回滾?

+0

同步不是一個事務,沒有辦法滾回來。如果在該塊中刪除了文件或發送了UDP數據報,您將如何回滾? – 2011-02-12 06:42:05

回答

7

線程1並沒有放棄鎖定,所以它仍然擁有它。當線程2準備採取鎖定時,它會發現它必須等待並輸入BLOCKED狀態。下一次操作系統調度Thread1時,它將完成執行並釋放鎖。這使Thread2可以再次調度。

3

線程2將不能進入該方法,直到線程1退出,因爲它是同步的。

最終,調度程序將繞過繼續使用線程1,線程1將執行新的Something()並退出該方法。然後,線程2將能夠通過構造新的Something()來輸入函數。

鎖的整個想法是,線程1不會丟失它,直到完成它。線程1在退出方法()時解鎖,然後線程2能夠獲取它。

+1

雖然有一種方法可以暫時「失去」同步塊中的鎖。調用`Object.wait()`。 – 2011-02-12 06:40:39