繁体   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