概述
Java 集合之ConcurrentHashMap使用注意事项
- 高并发场景下的其他哈希式集合
- HashTable
- HashMap
- ConcurrentHashMap 设计
- ConcurrentHashMap在JDK8之前的设计
- ConcurrentHashMap在JDK11的设计
- 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时,只会扩容并不会把链表转化为红黑树。
最后
以上就是平常猎豹为你收集整理的Java 集合之ConcurrentHashMap使用注意事项的全部内容,希望文章能够帮你解决Java 集合之ConcurrentHashMap使用注意事项所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复