java基础ConcurrentHashMap原理

本文深入剖析了JDK8版本ConcurrentHashMap的工作原理,重点介绍了其put操作的实现细节,包括如何利用CAS和synchronized关键字确保线程安全,以及在何种条件下会将链表转化为红黑树以提高性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考文献:
ConcurrentHashMap源码分析(JDK8版本)
从ConcurrentHashMap的演进看Java多线程核心技术 由于该文来自个人博客所有备份了一份见: /Users/lww/教程/集合

探索 ConcurrentHashMap 高并发性的实现机制 由于该文来自个人博客所有备份了一份见: /Users/lww/教程/集合

对于put操作,如果Key对应的数组元素为null,则通过CAS操作将其设置为当前值。如果Key对应的数组元素(也即链表表头或者树的根元素)不为null,则对该元素使用synchronized关键字申请锁,然后进行操作。如果该put操作使得当前链表长度超过一定阈值,则将该链表转换为树,从而提高寻址效率。由于寻址效率提高了则不需要用分段锁来提高读写效率了,所有jdk8就去掉了分段锁。我猜只是在改版链表或者(红黑树)结构的时候才需要同步,这样这种情况下才需要考虑读操作同步即下面一段文档所说的事情。 对于读操作,由于entry[]被volatile关键字修饰,因此不用担心数组的可见性问题。同时每个元素是一个Node实例(Java 7中每个元素是一个HashEntry),它的Key值和hash值都由final修饰,不可变更,无须关心它们被修改后的可见性问题。而其Value及对下一个元素的引用由volatile修饰,可见性也有保障。

转载于:https://juejin.im/post/5a6f55b7f265da3e33049b11

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值