ConcurrentHashMap与同步HashMap

hel*_*ity 140 java core

使用包装器类SynchronizedMap,在a HashMapConcurrentHashMap?之间有什么区别?它只是能够修改HashMap迭代它(ConcurrentHashMap)吗?

小智 110

同步HashMap:

  1. 使用对象级锁定同步每个方法.因此,synchMap上的get和put方法获得了一个锁.

  2. 锁定整个集合是一种性能开销.当一个线程持有锁时,没有其他线程可以使用该集合.

ConcurrentHashMap 在JDK 5中引入.

  1. 对象级别没有锁定,锁定的粒度更精细.对于a ConcurrentHashMap,锁可以处于散列映射桶级别.

  2. 较低级别锁定的效果是您可以拥有并发读取器和编写器,这对于同步集合是不可能的.这导致更多的可伸缩性.

  3. ConcurrentHashMapConcurrentModificationException如果一个线程试图修改它而另一个线程迭代它,则不抛出.

本文Java 7:HashMap vs ConcurrentHashMap 是一个非常好的阅读.强烈推荐.

  • 那么`Hashtable`和`Synchronized HashMap`之间的区别是什么? (5认同)
  • 值得一提的是,`ConcurrentHashMap` 的 `size()` 结果可能已经过时。根据“Java 并发实践”一书,允许 `size()` 返回近似值而不是精确计数。所以这个方法要慎用。 (2认同)

trs*_*hiv 85

简短的回答:

两个映射都是Map接口的线程安全实现.ConcurrentHashMap在预期高并发的情况下实现更高的吞吐量.

Brian Goetz 关于背后理念的文章ConcurrentHashMap非常好读.强烈推荐.

  • "Brian Goetz的文章......读起来非常好." - 更重要的是他的"实践中的Java并发"一书. (4认同)

fas*_*ava 29

ConcurrentHashMap在没有同步整个地图的情况下是线程安全的.使用锁完成写操作时,读操作可以非常快.


Sum*_*ada 11

我们可以通过使用ConcurrentHashMap和synchronisedHashmap来实现线程安全.但是,如果你看一下他们的架构,会有很多不同.

  1. synchronisedHashmap

它将保持对象级别的锁定.所以如果你想执行像put/get这样的任何操作,那么你必须首先获得锁.同时,不允许其他线程执行任何操作.所以一次只有一个线程可以对此进行操作.所以等待时间会增加.我们可以说与ConcurrentHashMap比较时性能相对较低.

  1. 的ConcurrentHashMap

它将保持段级别的锁定.它有16个段,默认情况下将并发级别维持在16.所以一次,16个线程可以在ConcurrentHashMap上运行.而且,读操作不需要锁定.因此任意数量的线程都可以对其执行get操作.

如果thread1想要在段2中执行put操作并且thread2想要在段4上执行put操作,那么这里允许它.意味着,16个线程可以一次对ConcurrentHashMap执行更新(put/delete)操作.

这样等待时间会减少.因此,性能相对优于synchronisedHashmap.


Ash*_*786 9

两者都是HashMap的同步版本,其核心功能和内部结构不同.

ConcurrentHashMap由内部段组成,可以从概念上看作独立的HashMaps.在高并发执行中,所有这些段都可以由单独的线程锁定.因此,多个线程可以从ConcurrentHashMap获取/放置键值对,而不会阻塞/等待彼此.这是为了提高吞吐量而实现的.

在Collections.synchronizedMap()中,我们获得了HashMap的同步版本,并以阻塞方式访问它.这意味着如果多个线程同时尝试访问synchronizedMap,则允许它们以同步方式一次获取/放置一个键值对.


Job*_*ews 8

SynchronizedMapConcurrentHashMap都是线程安全类并且可以在多线程应用程序中使用,它们之间的主要区别在于它们如何实现线程安全。

SynchronizedMap获取对整个 Map 实例的锁,同时ConcurrentHashMap将 Map 实例分成多个段并在这些段上进行锁定。

在此处输入图片说明

在此处输入图片说明


rai*_*mar 7

ConcurrentHashMap使用更细粒度的锁定机制lock stripping,允许更大程度的共享访问.因此,它提供了更好的并发性可伸缩性.

返回的迭代器ConcurrentHashMap也是弱一致的,而不是Synchronized HashMap使用的失败快速技术.