使用包装器类SynchronizedMap,在a HashMap和ConcurrentHashMap?之间有什么区别?它只是能够修改HashMap迭代它(ConcurrentHashMap)吗?
小智 110
同步HashMap:
使用对象级锁定同步每个方法.因此,synchMap上的get和put方法获得了一个锁.
锁定整个集合是一种性能开销.当一个线程持有锁时,没有其他线程可以使用该集合.
ConcurrentHashMap 在JDK 5中引入.
对象级别没有锁定,锁定的粒度更精细.对于a ConcurrentHashMap,锁可以处于散列映射桶级别.
较低级别锁定的效果是您可以拥有并发读取器和编写器,这对于同步集合是不可能的.这导致更多的可伸缩性.
ConcurrentHashMapConcurrentModificationException如果一个线程试图修改它而另一个线程迭代它,则不抛出.
本文Java 7:HashMap vs ConcurrentHashMap 是一个非常好的阅读.强烈推荐.
Sum*_*ada 11
我们可以通过使用ConcurrentHashMap和synchronisedHashmap来实现线程安全.但是,如果你看一下他们的架构,会有很多不同.
它将保持对象级别的锁定.所以如果你想执行像put/get这样的任何操作,那么你必须首先获得锁.同时,不允许其他线程执行任何操作.所以一次只有一个线程可以对此进行操作.所以等待时间会增加.我们可以说与ConcurrentHashMap比较时性能相对较低.
它将保持段级别的锁定.它有16个段,默认情况下将并发级别维持在16.所以一次,16个线程可以在ConcurrentHashMap上运行.而且,读操作不需要锁定.因此任意数量的线程都可以对其执行get操作.
如果thread1想要在段2中执行put操作并且thread2想要在段4上执行put操作,那么这里允许它.意味着,16个线程可以一次对ConcurrentHashMap执行更新(put/delete)操作.
这样等待时间会减少.因此,性能相对优于synchronisedHashmap.
两者都是HashMap的同步版本,其核心功能和内部结构不同.
ConcurrentHashMap由内部段组成,可以从概念上看作独立的HashMaps.在高并发执行中,所有这些段都可以由单独的线程锁定.因此,多个线程可以从ConcurrentHashMap获取/放置键值对,而不会阻塞/等待彼此.这是为了提高吞吐量而实现的.
而
在Collections.synchronizedMap()中,我们获得了HashMap的同步版本,并以阻塞方式访问它.这意味着如果多个线程同时尝试访问synchronizedMap,则允许它们以同步方式一次获取/放置一个键值对.
SynchronizedMap和ConcurrentHashMap都是线程安全类并且可以在多线程应用程序中使用,它们之间的主要区别在于它们如何实现线程安全。
SynchronizedMap获取对整个 Map 实例的锁,同时ConcurrentHashMap将 Map 实例分成多个段并在这些段上进行锁定。
ConcurrentHashMap使用更细粒度的锁定机制lock stripping,允许更大程度的共享访问.因此,它提供了更好的并发性和可伸缩性.
返回的迭代器ConcurrentHashMap也是弱一致的,而不是Synchronized HashMap使用的失败快速技术.
| 归档时间: |
|
| 查看次数: |
131678 次 |
| 最近记录: |