Java ConCurrentHashMap原理总结

本文深入解析了ConCurrentHashMap的工作原理,包括其内部结构、get和put操作流程、扩容机制及迭代特性等。此外还介绍了其如何通过锁分段技术提高并发访问效率。

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

Java ConCurrentHashMap原理总结

ConCurrentHashMap采用锁分段技术提高了并发访问效率。它由segment数组和HashEntry数组组成。segment是采用了可重入锁,在map里扮演锁的角色;HashEntry则存储键值对数据。存储结构图如下:




get取数据操作:1)、定位segment:通过key的hash值进行再hash,取再hash值得高位与(segement数组-1)进行相与。

                           2)、定位HashEntry:直接使用在hash值与(HashEntry数组-1)进行相与。

   3)、get操作不加锁,可以并发无限制读。

  4)、get取到的值是弱一致性的。可以取到更新完毕的值,但更新过程中的值可以取不到。

put操作:1)、判断是否需要对Segment里的HashEntry数组进行扩容。判断依据是threshold*负载因=容量。如果不扩容找到位置进行存储。

                2)、扩容为原来的两倍。

  3)、写操作有锁,线程可以并发访问Map、并且一定数量(默认是使用16个锁)的写线程也可以并发修改Map。

size统计:先尝试2次通过不锁定segement方式来统计各个segement大小,如果统计中容器count发生了变化,则再采用加锁来统计。使用modCount变量来判断是否发生了变化,通过比较前后值得变化来判断是否进行了修改,因为每次修改modcount进行自动加1。

迭代:1)、ConcurrentHashMap提供的迭代器不会抛出ConcurrentModificationExeption,而且具有弱一致性,它可以容忍并发的修改。当创建迭代器时会遍历已有的元素,并可以(但是不保证)在迭代器被构造后将修改操作反映给容器。即遍历位置过的地方修改的数据不会显现,未遍历过位置的地方更新数据会立即显现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值