![](/img/trans.png)
[英]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.