2011-05-01 115 views
1


我需要將我的訪問同步到散列映射。 這裏是我的選項同步vs鎖vs同步映射

  1. 我知道我可以使用Synchronize關鍵字。這是一種選擇。我可以使用地圖嗎?
  2. 目前我有一個get方法,如果對象不存在,創建它並將其放入地圖中。我可以同步該方法。
  3. 我可以使用一個syncronize塊
  4. 我可以使用
    圖M = Collections.synchronizedMap(新的HashMap(...)); 在我的代碼中。

我傾向於做4,因爲它聽起來是最簡單的。有什麼建議麼?

回答

5

我建議你不要使方法同步,並且你不鎖定在地圖本身。我通常更喜歡使用一個單獨的鎖定對象,它只有用於鎖定只有在擁有該地圖的類中已知。

你可能潛在使用synchronizedMap,但它取決於你想要用它做什麼。如果你只能得到和放置價值,那就沒問題。如果您需要在地圖上重複迭代,則需要在迭代過程中阻止其他線程修改地圖。

另一種選擇是使用ConcurrentHashMap。請參閱文檔以瞭解語義。如果它按照你需要的方式行事,這可能是最簡單的方法。

+0

謝謝。爲什麼不使用地圖本身? – Jeb 2011-05-01 07:43:44

+0

@ useer450602:我真的很想知道*什麼樣的代碼可能最終試圖獲得一個鎖 - 如果我不控制一個鎖,就會導致更難解釋它。確保* no *其他代碼可以鎖定某些東西的唯一方法是使其成爲只有您的代碼才知道開始的對象。 – 2011-05-01 07:46:46

2

你可以使用ConcurrentHashMap.putIfAbsent(),它可以做你想要的而不需要同步。