[英]ConcurrentHashMap: Using merge() on a nested concurrentHashMap in Java
[英]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.