何时使用 ConcurrentHashMap [重复]

Posted

技术标签:

【中文标题】何时使用 ConcurrentHashMap [重复]【英文标题】:When to use ConcurrentHashMap [duplicate] 【发布时间】:2012-12-23 03:09:35 【问题描述】:

可能重复:What’s the difference between ConcurrentHashMap and Collections.synchronizedMap(Map)?

我正在阅读 HashMap、Collenctions.synchonizedMap 和 ConcurrentHashMap 之间的差异。我的理解是 Collections.synchronizedMap 对整个集合应用了锁,因此会产生性能开销。但是 ConcurrentHashMap 不使用同步。它使用段来实现结果,因此它提供了与 HashMap 相似的性能。

如果我的理解正确,请提出建议。此外,如果是这种情况,即使可能没有多个线程访问它,我是否可以在任何地方使用 ConcurrentHashMap?

【问题讨论】:

我也解决了这个问题。它主要讨论涉及多个线程并且需要并发的情况。但是,我想知道我是否可以使用 ConcurrentHashMap,即使我只能使用 HashMap。 你可以....但是你为什么会呢?您无缘无故地增加了开销; “相似”!=“相同”。 这样的话,你可以看看***.com/questions/1378310/… 【参考方案1】:

ConcurrentHashMap 不使用同步。它使用细分来实现结果

ConcurrentHashMap 在段级别同步,允许原子操作,如 putIfAbsent 或用新值替换旧值。这种优势来自一种称为锁条的技术。

即使可能没有多个线程访问它,我也可以在任何地方使用 ConcurrentHashMap 吗?

不,我没有理由这样做。撇开性能不谈,数据结构的选择还可以作为关于如何使用代码的文档(HashMap--> 单线程)。仅当使用它的类是线程安全的时才使用 ConcurrentHashMap;否则,在非线程安全类中使用线程安全数据结构会增加下一个查看代码的人的困惑。

【讨论】:

以上是关于何时使用 ConcurrentHashMap [重复]的主要内容,如果未能解决你的问题,请参考以下文章

死磕 java集合之ConcurrentHashMap源码分析

Java ConcurrentHashMap

是否可以知道树中的项目何时被重命名?

何时以及如何使用 Apollo 客户端和 React 路由器进行重定向

CopyOnWriteArraySet 何时对实现线程安全的 HashSet 有用?

检测 UIView/UILabel 何时重绘自身?