学习笔记:《程序员小灰》ConcurrentHashMap

1 ConcurrentHashMap的底层原理

在这里插入图片描述

  • HashTable读写时都给整个集合加锁;ConcurrentHashMap使用可重入锁的分段锁技术。
  • ConcurrentHashMap集合的segments数组中有2的N次方个Segment对象。
  • 两次hash运算:首先定位到Segment,之后定位到Segment内的具体数组下标。

ConcurrentHashMap并发读写:

  • 不同Segment的读写可以并发执行;
  • 同一Segment的写和读可以并发执行;
  • 同一Segment的并发写入会被阻塞。

2 调用size()方法时解决一致性问题

为了尽量不锁住所有Segment,首先乐观地假设size()过程中不会有修改。当尝试到一定次数,才无奈转为悲观锁,锁住所有Segment保证强一致性。

  • 遍历所有Segment;
  • 把Segment的元素数量累加起来;
  • 把Segment的修改次数累加起来;
  • 判断所有Segment的总修改次数是否大于上一次的总修改次数。如果大于,说明统计过程中有修改,重新统计,尝试次数+1;如果等于,说明没有修改,统计结束;
  • 如果尝试次数超过阈值,则对每个Segment加锁,重新统计;
  • 再次判断所有Segment的总修改次数是否大于上一次的总修改次数。由于已经加锁,次数一定和上次相等。
  • 释放锁,统计结束。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值