2013-10-18 84 views
-1
... 
lock.lock() 
try{ 
... 
} 
finally{ 
lock.unlock()} 
... 

我注意到,這並不能保證絕對互斥,因爲同步總是這樣,所以兩者之間究竟有什麼區別?同步塊和條件變量鎖之間有什麼區別?

import java.util.concurrent.locks.Condition; 
import java.util.concurrent.locks.Lock; 
import java.util.concurrent.locks.ReentrantLock; 

    public class Guys extends Thread{ 



      public static void go()throws InterruptedException{ 

       final Lock lock = new ReentrantLock(); 



       lock.lock(); 
       try{ 



       System.out.println("global " + main.global); 



       main.global = main.global + 100; 
       } 
       finally 
       { 


       lock.unlock(); 
       } 


      } 






     public void run(){ 

      try{ 



       for(int i = 0; i <1; i++) 
       { 
        System.out.println(this); 




        go(); 



       } 
      } catch(InterruptedException e) 
      { 
       System.out.println("Interrupted Exception caught"); 
      } 

     } 


    } 

我的帖子共享一個資源。在這種情況下只能同步工作。

+0

這是哪個平臺? –

+0

哦對不起..它在java –

+0

我認爲它會工作,因爲它被建議作爲替代,但顯然它不是一樣的事情http://stackoverflow.com/questions/5482981/other-way-to-synchronize-method –

回答

0

你正在創建一個新的Lock對象,每個線程都鎖定在不同的對象上。

取出這一行

final Lock lock = new ReentrantLock(); 

以外的方法使其成爲一個類的成員,它應該正常工作。

@Edit:OK更深入的解釋:

製作同步的方法與對象,就像你會做它用的鎖定對象自己的鎖,保護它。如果它是非靜態方法,則鎖定在「this」對象上完成。由於你在這裏有一個靜態方法,所以鎖將代表你的Guys類的對象。有一個這樣的對象,所以只會獲得一個鎖。如果一個線程持有別人不得不等待的鎖定。

你在這裏做的是在每次調用go()方法時創建一個新的Lock對象,因此調用go()方法的每個線程都會獲得一個不同的鎖,它從無到有保護你,因爲只有該線程可以調用lock.lock ()(正如我所說的,其他線程將在它們自己的Lock實例上調用lock())。

將此Lock變量帶出該方法並將其變爲類變量將意味着調用go()方法的所有線程將嘗試獲取相同的鎖定 - 與synchronized同樣。

@ Edit2:更加生動地展現它,就像有一羣人一樣,只有拿着棍子的人才能說話。當只有1個棒時(這是使用同步方法或共享鎖對象的情況),一切都可以。但顯然當它是一羣波蘭人時(編輯註釋我是波蘭人,所以我可以取笑我自己的人),每個人都會帶着他們自己的棍子(在這裏它和你的新ReentrantLock()類似)。這將導致每個人都在同一時間發言。顯然,每個人都會像「omg,但我有一根棍子,我現在有充分的權利發言!」。

+0

所以只有同步將在這種情況下工作?我無法創建一個全局鎖或任何東西,所以我真的沒有看到任何解決方案。 –

+0

嗯......確定感謝一下 –

+0

如果每個男人的線程都必須與女孩線交錯,該怎麼辦? –

0

synchronnized塊是一些有用的但非定製的方式來授予只有一個線程可以訪問關鍵代碼塊。讓我們回顧一些lock對象給你帶來好處超過同步塊:

Reenterability - 想想裏面遞歸同步塊。你確定它沒有失敗嗎?有 ReentrantLock將幫助您

讀寫鎖 - 假設你有一千個讀者一些地圖,但只有1作家。如果讀者可以同時閱讀,那麼可以採取大的優化,但鎖定僅針對作者。然後try..finallyReadWriteLock給你很大的好處

+0

'synchronized'塊*是*可重入的。 Locks * *可能是可重入的。 –

+0

@EtienneMiret謝謝,只是通過這種情況下 – Dewfy

相關問題