ConcurrentHashMap使用Node+CAS+synchronized实现线程安全

本文探讨了ConcurrentHashMap为何线程安全,对比了JDK1.7和JDK1.8的不同实现方式。在JDK1.7中,ConcurrentHashMap使用Segment和HashEntry,而在JDK1.8中,它依赖于Node+CAS+synchronized。通过Unsafe类的原子方法,保证在多线程环境下高效地进行并发操作,实现乐观锁的特性。

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

官网对ConcurrentHashMap的使用场景的介绍

//{Hashtable} is synchronized.  If a
//thread-safe implementation is not needed, it is recommended to use
//{HashMap} in place of {@code Hashtable}.  If a thread-safe
//highly-concurrent implementation is desired, then it is recommended
//to use {@link java.util.concurrent.ConcurrentHashMap} in place of
//{@code Hashtable}.
//不考虑并发的情况,使用HashMap()
//考虑低并发的情况,使用Hashtable()
//高并发的情况使用ConcurrentHashMap
为什么HashTable是线程安全的

HashTable能够保证线程安全的原因是,put、get、remove以及size、isEmpty等方法全部都用了Synchronized加同步锁,保证每一次只有一个线程能够对其进行改动。保证了线程安全,但是效率很低。

JDK1.7和JDK1.8的不同实现

JDK1.7里面,ConcurrentHashMap是用Segment和HashEntry实现的,每个Segment都是继承于Reentrantlock的,在对该segment进行操作时,获取锁,结束操作释放锁。
JDK1.8里面,没有用segment,而是用Node+CAS+synchronized实现的。

Node+CAS+synchronized实现
public class ConcurrentHashMap<K,V> extends AbstractM
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值