concurrentHashmap的实现,如何实现线程安全的

ConcurrentHashMap通过分段锁技术提升并发性能,优于Hashtable。其底层由segment数组构成,每个segment可独立加锁,支持高并发场景。1.7版本中,get操作基本无需加锁,利用volatile保证数据可见性和一致性;put操作需锁定segment,进行扩容判断及元素添加,更新count确保get获取最新值。

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

concurrentHashMap最主要特点是采用了分段锁技术,并发效果要比hashtable好一点。它的底层是一个segment数组,每个segment又链接了一个同hashtable类似的数据结构(1.7和1.8同样采用了不同的结构),由于segment继承了ReentrantLock,所以每个segment都可以加锁。
它与hashmap的一些差异
entry有一定的差异性,它除了value没有定义为final其余的都定义为final.
1.7GET:先调用segmentfor根据hash值找到对应的segment,然后根据hash运算找到元素,整个过程不需要枷锁,除非读到空值才枷锁重读。为什么不加锁,是因为get将需要的共享变量都定义为violate,比如统计segment大小的count和hashentry的value.violate变量能够在多个线程保持可见性,由于happen-before也不会读到过期的值(对violate字段的写入先于读操作)。
1.7PUT:
put方法首先定位到segment,然后在segment里进行插入操作,进入segment会获取锁,插入操作需要两个步骤,首先判断扩容,然后定位添加元素的位置放在hashtentry数组链表中。最后如果修改了数据结构则会修改count,保证get得到的值是新的,然后解除锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值