
文章插图
② 这个判断又是一个细节,wasUncontended这个变量从头到尾只在这个判断里用到,大家有没有想过,这个变量是干什么的,可以去掉吗
这个变量命名直译过来是是否无竞争,什么意思,竞争什么呢
我们不妨倒推一下,满足什么样的条件会执行到这里,从上面的 if 可以得知,执行到这里要满足 2 个条件
- (as = counterCells) != null && (n = as.length) > 0,数组不为空
- (a = as[(n - 1) & h]) == null,目标索引位不为空
if ((as = counterCells) != null || !U.compareAndSwapLong(this, BASECOUNT, b = baseCount, s = b + x)) {CounterCell a; long v; int m;boolean uncontended = true;if (as == null || (m = as.length - 1) < 0 ||(a = as[ThreadLocalRandom.getProbe() & m]) == null ||!(uncontended =U.compareAndSwapLong(a, CELLVALUE, v = a.value, v + x))) {fullAddCount(x, uncontended);return;}if (check <= 1)return;s = sumCount();}根据上面得出的 2 个条件,在满足这 2 个条件的情况下想进入 fullAddCount 方法只有一种情况,就是!(uncontended = U.compareAndSwapLong(a, CELLVALUE, v = a.value, v + x)),也就是 CAS 设置失败的情况下回到 fullAddCount 方法里,如果!wasUncontended 这个条件去掉的话,那么又会进行一次一模一样的 CAS 操作,而这 2 个 CAS 操作间没有任何耗时的操作,那么很大概率,这次的 CAS 又会失败,而 CAS 是通过操作底层操作系统来实现的,也是有性能损耗的,所以这里进行了一次拦截,不让他再继续执行 CAS,而是通过底部的 advanceProbe 方法,将 hash 值更改一下,路由到其他的下标位上在重新尝试
所以,这下你知道为什么ConcurrentHashMap性能这么高了吧
③,通过 CAS 进行赋值,成功就退出,没什么说的
③④,细节又来了(手动落泪),刚刚我们分析过,执行到上一个 if 的时候,已经 CAS 失败一次了,加上上一个 if本身,就是已经 CAS 失败 2 次了,那么,这个时候该考虑什么?
当然是扩容啦,对不对,这里有一个变量collide,翻译过来是碰撞的意思,前半部分判断counterCells != as,是否已经扩容了,如果 true,表示已经扩容了,那么 collide 设为默认值 false,我刚扩过容,肯定不存在碰撞,是吧 。如果没扩容,判断容量是否大于 CPU 个数,如果小于,说明还有扩容的空间,因为理论上,最多支持 CPU 个数的线程对数组进行同时操作,所以会进行下一个 if 判断,如果已经大于等于 CPU,那么已经没有扩容的空间了,那么就要把 collide 设为 false,阻止进入到后面的扩容操作
④ 这个判断又是干嘛用的吗,看起来和 ② 很像呀,其实作用也是差不多的,就是再给你最后一次机会,重新 hash 然后看看能不能成功,如果还不能成功,没办法,竞争太激烈了,只能扩容了(无奈)
最后来到 ⑤,也就是扩容,这里倒没什么好讲的,新建一个容量是之前 2 倍的数组,然后将原数组复制过来,最后将 collide 重新置为 false
在第一个大的 if 判断里,里面的每个小 if 除非执行到 continue 或者 break,否则都会执行到advanceProbe这个方法
static final int advanceProbe(int probe) {probe ^= probe << 13;// xorshiftprobe ^= probe >>> 17;probe ^= probe << 5;UNSAFE.putInt(Thread.currentThread(), PROBE, probe);return probe;}【onlyit onlyifabsent】其实就是通过位运算将 hash 值改变一下,重新路由到另一个下标位上去,避开冲突的下标位,在方法的开头说过为什么等于 0 需要初始化重新赋值,因为如果是 0 的话,经过位运算操作还是0,就很尴尬了
- 陆游临安春雨初霁赏析及感悟 临安春雨初霁陆游赏析
- 不足5㎡的卫生间,也有很多需要“操心的事”,建议大家收藏!
- 孕产妇孕期保健 孕妇保健app
- game游戏中心官方 在线游戏网站
- 核舟记翻译文言文 核舟记翻译最简短
- 刀锋意志 手游刀锋意志出装
- 现代养殖业最赚钱行业 哪种养殖业最赚钱
- 火炬之光1技能树 火炬之光技能搭配
- 皇帝成长计划游戏 皇帝成长计划测试版
- 阿里巴巴国际站好做吗? 阿里巴巴国际站怎么做好
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
