Java 集合之ConcurrentHashMap使用注意事项

考虑到线程并发安全性,ConcurrentHashMap 是比HashMap 更推荐的一种哈希式集合。

JDK8 对ConcurrentHashMap 进行了脱胎换骨式的改造,使用了大量的lock-free技术来减轻因锁的竞争而对性能造成的影响。

它是学习并发编程的一个绝佳示例。 此类超过6300行代码,涉及volatile ,CAS,锁,链表,红黑树等众多知识点。

高并发场景下的其他哈希式集合


HashTable

HashTalbe 是JDK 1.0 引入的哈希式集合,以全互斥方式处理并发情况,性能极差。

已废弃,不推荐使用。

HashMap

HashMap 是JDK1.2 引入的,非线程安全的,最大问题是并发写的时候,容易出现死链问题。

ConcurrentHashMap 设计

ConcurrentHashMap 是JDK5 引入的线程安全的哈希式集合。


ConcurrentHashMap在JDK8之前的设计

JDK8 之前采用分段锁的设计理念,相当于HahsTable和HashMap折中版本,是效率和一致性权衡后的结果。分段锁是由内部类Segment 实现的,它继承自ReentrantLock,用来管辖它辖区的各个HashEntry。

我们可以理解成 ConcurrentHashMap 被Segment 分成了很多小区,Segment 就相当于小区保安,HashEntry列表相当于小区业主,小区保安通过加锁的方式,保证每个Segment 内部不发生冲突。

ConcurrentHashMap在JDK11的设计

JDK11 对JDK7 下的ConcurrentHashMap 做了如下优化:

  • 取消分段锁机制,进一步降低冲突概率。
  • 引入红黑树结构
  • 使用了更加优化的方式统计集合内的元素数量

ConcurrentHashMap 使用注意事项

  • 当某个槽内的元素增加到8个且table的容量大于或等于64的时候,由链表转为红黑树。
  • 当某个槽内的元素个数减少到6个时,由红黑树重新转回链表。
  • 链表转化为红黑树的过程,就是把给定顺序的元素构造成一颗红黑树的过程。
  • 注意的是,当table 的容量小于64时,只会扩容并不会把链表转化为红黑树。
发布了162 篇原创文章 · 获赞 219 · 访问量 40万+

猜你喜欢

转载自blog.csdn.net/hadues/article/details/103162343