2013-04-11 67 views
4

我用CopyOnWriteArrayList相當很多。當是ConcurrentHashMap的比喻的CopyOnWriteArrayList

  • 線程執行大量的閱讀
  • 線程執行一點點寫的

但是這是特別真實,我會用Collections.synchronizedList()

  • 線程執行一點點閱讀
  • 線程執行大量寫的

這是因爲根據CopyOnWriteArrayList Java Doc

ArrayList的一個線程安全的變體,其中所有可變操作 (添加,設置,等等)通過使 底層數組的新副本被實現。

這通常是成本太高,...

當談到ConcurrentHashMap,我不知道我能仍然適用同樣的邏輯在選擇ConcurrentHashMapCollections.synchronizedMap()

ConcurrentHashMap是否每次執行寫入操作都會創建底層數據結構的新副本?如果寫入操作多於讀取操作,它是否會比Collections.synchronizedMap執行得更糟?

+1

http://stackoverflow.com/questions/11793067/how-does-concurrenthashmap-work-internally – NPE 2013-04-11 07:58:25

回答

6

不,ConcurrentHashMap不作底層數據結構的新副本。

ConcurrentHashMap是分段圖,段數是基於併發級別。當你寫入一個段時,它會被鎖定,直到寫入完成。

0

ConcurrentHashMap幾乎總是使用,因爲它具有更好的性能和更實用的API右一個(可以避開check-then-set線程問題)比其同行
它採用鎖精細剝離細粒度訪問,並且不復制地圖。
只有應用程序,你不應該使用一個ConcurrentHashMap是當你需要鎖定地圖獨家訪問

+0

婭。我知道。但那還沒有解決我的問題。 ConcurrentHashMap是否每次執行寫入操作時都會創建底層數據結構的新副本? – 2013-04-11 07:57:18

+0

首先,爲什麼你關心它的表現如何被記錄爲最好的?不,它不復制。它使用鎖定剝離來修改底層映射的各個部分 – Cratylus 2013-04-11 08:00:00

+0

由於CopyOnWriteArrayList比Write.synchronizedList的執行效率差,因此當有多個寫操作而不是讀操作時。因此,我關心這種行爲是否也發生在ConcurrentHashMap中。 – 2013-04-11 08:01:38

1

當寫入ConcurrentHashMap時,它只鎖定正在寫入的內部映射部分。因此,通過這種行爲,我們可以很容易地看到它不會創建新副本,而是在同一副本中進行更改。
所以當我們嘗試在ConcurrentHashMap寫那麼就意味着我們試圖在任何段寫那麼它只是鎖定該段以及只更新segment.So簡單的話,它永遠不要使得任何新的副本。所以你的問題的答案是NO。