Java中ConcurrentHashMap类

什么是ConcurrentHashMap?

ConcurrentHashMap(简称CHM)是在Java 1.5作为Hashtable的替代选择新引入的,是concurrent包的重要成员。

ConcurrentHashMap的锁分段技术

HashTable容器在竞争激烈的并发环境下表现出效率低下的原因,是因为所有访问HashTable的线程都必须竞争同一把锁,那假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。

什么时候使用ConcurrentHashMap?

CHM适用于读者数量超过写者时,当写者数量大于等于读者时,CHM的性能是低于Hashtable和synchronized Map的。这是因为当锁住了整个Map时,读操作要等待对同一部分执行写操作的线程结束。CHM适用于做cache,在程序启动时初始化,之后可以被多个请求线程访问。正如Javadoc说明的那样,CHM是HashTable一个很好的替代,但要记住,CHM的比HashTable的同步性稍弱。

CHM的一些关键点:

1、CHM允许并发的读和线程安全的更新操作
2、在执行写操作时,CHM只锁住部分的Map
3、并发的更新是通过内部根据并发级别将Map分割成小部分实现的
4、高的并发级别会造成时间和空间的浪费,低的并发级别在写线程多时会引起线程间的竞争
5、CHM的所有操作都是线程安全
6、CHM返回的迭代器是弱一致性,fail-safe并且不会抛出ConcurrentModificationException异常
7、CHM不允许null的键值
8、可以使用CHM代替HashTable,但要记住CHM不会锁住整个Map

猜你喜欢

转载自blog.csdn.net/scbiaosdo/article/details/80330070
今日推荐