簡體   English   中英

使用ConcurrentHashMap

[英]Using ConcurrentHashMap

我是Java新線程的新手,我需要從幾個活動線程訪問數據結構。 我聽說java.util.concurrent.ConcurrentHashMap是線程友好的。 訪問ConcurrentHashMap時是否需要使用synchronized(map){}或者它本身會處理鎖?

它處理鎖本身,實際上你無權訪問它們(沒有其他選擇)

您可以在特殊情況下使用synchronized進行寫入,但您很少需要執行此操作。 例如,如果您需要實現自己的putIfAbsent因為創建對象的成本很高。

使用syncrhonized進行讀取會破壞使用並發集合的目的。

ConcurrentHashMap僅適用於您不需要比開箱即用提供的更多原子性的情況。 例如,如果你需要獲取一個值,用它做一些事情,然后設置一個新的值,所有這些都在原子操作中,沒有外部鎖定就無法實現。

在所有這些情況下,沒有任何東西可以替代代碼中的顯式鎖,並且使用此實現而不是基本的HashMap只是浪費。

簡答:你不需要使用synchronized(map)
答案很長:

  • ConcurrentHashMap提供的所有操作都是線程安全的,您可以調用它們而不必擔心鎖定
  • 但是,如果您需要某些操作在代碼中是原子操作,則仍需要在客戶端進行某種鎖定

不,您不需要,但如果您需要依賴內部同步,則應使用Collections.synchronizedMap ConcurrentHashMap的javadoc:

在依賴於線程安全但不依賴於其同步細節的程序中,此類可與Hashtable完全互操作。

實際上它不會在整個數據結構上同步,而是在它的子部分(一些桶)上同步。 這意味着ConcurrentHashMap的迭代器非常一致,並且映射的大小可能不准確。 (但另一方面,它的放置和獲取操作仍然一致,吞吐量更高)

除了它提供的並發功能之外,concurrenthmp還有一個值得注意的重要功能 ,即故障安全迭代器。 使用CHMP只是因為他們想要在迭代時編輯put / remove的入口集。 Collections.synchronizedMap(Map)是另一個。 但是ConcurrentModificationException可能出現在上面的情況中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM