banner
RustyNail

RustyNail

coder. 【blog】https://rustynail.me 【nostr】wss://ts.relays.world/ wss://relays.world/nostr

【翻译】Difference between ConcurrentHashMap, Hashtable and Synchronized Map in Java

翻译自:Javarevisited's Blog

ConcurrentHashMap vs Hashtable vs Synchronized Map#

虽然这三个类都能多线程安全地在 Java 并发程序中使用,但是他们之间有者标志性的不同,主要体现在他们是怎么实现他们的线程安全的。

HashTable 在 Java1.1 就已经出现了,使用同步的方法来实现线程安全,Hashtable 里的方法都是 Synchronized 的,这使得它在线程增多的时候会变得很慢。
Synchronized Map 和 Hashtable 并没有太大的不同,以及它在并发编程的时候提供了相似的性能。hashtable 和 Synchronized Map 之间的唯一不同在于后者可以使用Collections.synchronizedMap()方法把任何的 Map 变成同步版本。

在另一方面,ConcurrentHashMap 是特别设计出来给并发编程使用的。默认地,它同时允许 16 个线程在没有任何外部的同步措施下读写 Map。
由于内部实现了分段锁,所以有相当的拓展性。和 SynchronizedMap 和 Hashtable 不一样,它不会把整个 Map 锁住,而是,把 map 分段(Segment),然后再给他们都加上锁。
所以在读(get 不加锁)比写的性能要高

老实说,Collections 类作为 JavaAPI 的核心类,我认为,审慎地使用它们是一种艺术。我的个人经验是,使用 Array List 代替不必要地 Vector 之类的可以提高 Java 应用的性能之类的。
在 Java5 之前,Java Collection 框架的一个问题在于缺少可拓展性。

在多线程 Java 应用中像 Hash table 和 Vector 很快会成瓶颈;在 Java1.5 后提出了拓展性,并推荐了一线不错的并发容器,在数据量大的时候能保持高效。
遗留的的系统,像电子贸易系统以有能快速访问储存的数据的能力作为支持(注:指使用能支持快速高并发的容器)。

在这篇说明中,我们讨论了 ConcurrentHashMap, Hashtable, HashMap 和 synchronized Map ,还探讨了在 Java 中 ConcurrentHashMap 、 Hashtable
和 synchronized Map 的不同。在这篇博客中也讨论了 Hashtable, HashMap 的不同,这些能在面试的时候帮你回答一些问题。

为什么需要 ConcurrentHashMap 和 CopyOnWriteArrayList#

同步的容器,如 Hashtable, Vector, Collections.synchronizedMap () 和 Collections.synchronizedList (), 提供了可选的线程安全的 Map 或 List 实现。
但是,一些因子让他们不是很适合用在高并发程序中,比如,它们范围很大的锁会妨碍他们的拓展性,以及通常在迭代访问的时候需要锁住整个容器来防止 ConcurrentModificationException。

ConcurrentHashMap 和 CopyOnWriteArrayList 的实现提供了更高的并发的同时保证了线程安全, 以最小的代价妥协调用者。
ConcurrentHashMap 和 CopyOnWriteArrayList 并不是必要在哪都要用,你也可以使用 HashMap 或 ArrayList, 但是要在特定的情况下(注:并发安全)。在很多并发程序中使用它们可以得到好处。

ConcurrentHashMap 和 Hashtable 的不同#

所以 ConcurrentHashMap 和 Hashtable 的不同在哪呢,都能用在多线程环境,但是 当 Hashtable 的大小变大的时候性能会有可观的消耗,因为在访问的时候会给整个容器加锁。

ConcurrentHashMap 会给数据分段,不管数据量多大,只用关心被加锁的范围。在保证线程安全的前提下,很多其他的读线程在迭代完成之前能够访问容器。

总结一下,在迭代的时候 ConcurrentHashMap 只会锁住 map 的一部分, 但是 HashMap 会锁住整个 map. 这幅图清晰的表达了 Java ConcurrentHashMap 的内部工作原理。

ConcurrentHashMap

ConcurrentHashMap 和 Collections.synchronizedMap 的不同#

ConcurrentHashMap 为了并发设计的 并提升了性能 ,HashMap 原生状态下是非同步的 ,使用 synchronized Map 可以包裹它让它变成同步容器。 有一些 ConcurrentHashMap 和 Collections.synchronizedMap 的不同:

ConcurrentHashMap 不允许 null 键 或 null 值 , synchronized HashMap 允许一个 null 键.

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。