2013-01-10 60 views
2
Class A { 
    private Map<Oject,Object> map; 
    public void clear() { 
     map.clear(); 
    } 

    public void work() { 
     synchronized (map) { 
      map.put(new Object, new Object(); 
     } 
    } 
} 

如果線程A位於work()方法的中間,這是否意味着如果執行clear()方法,線程B不會阻塞?當在一個地方只有一個對象使用同步塊時會發生什麼?

上面的代碼和這個有什麼區別?

public void clear() { 
     synchronized (map) { 
      map.clear(); 
     } 
    } 

回答

5

您的懷疑是正確的;此代碼有一個錯誤。

您還需要鎖定clear();除此以外;您仍然可以同時運行put()clear()

但是,您實際上應該使用ConcurrentHashMap()來代替。

+0

+1爲ConcurrentHashMap。 – digitaljoel

+0

或Collections.synchronizedMap) – Leonidos

+0

@SLaks我覺得他在找什麼是Collections.synchronizedMap。因爲如果一個線程正在放置(..),他希望s鎖定地圖。使用Concur..Map,來自不同線程的clear()和put()可以同時進行。如果我的理解錯誤,請糾正我。 – Kent

1

正確。爲什麼呢?這就是​​塊的要點 - 而線程B還沒有執行​​塊。在這種情況下,完全沒有任何同步。

0

對於應該控制對給定資源的訪問權限的每個位置,您應該同步。你的第一個例子只會以同步方式運行,如果它碰到一個同步塊(它不在clear()中),否則它將繼續正常。在第二個例子中,您鎖定clear()將導致線程B檢查。

相關問題