final V putVal(K key, V value, boolean onlyIfAbsent) {
//如果是null 直接抛异常
if (key == null || value == null) throw new NullPointerException();
//spread函数得到一个优良的hash值,一定是正数
int hash = spread(key.hashCode());
int binCount = 0;
//进入死循环 首先把table赋给tab
for (Node<K,V>[] tab = table;;) {
Node<K,V> f; int n, i, fh;
//第一次肯定为null 进行初始化initTable()
/*(初始化先判断是否为空
拿到sizeCtl,如果小于0表示别人在初始化,自己不用,Thread.yield()
大于0,利用CAS把sizeCtl设置为-1,表示正在初始化.
如果CAS失败就自旋再判断sizeCtl
如果成功就再判断当前tab是否为空 doble check
然后设置Node数组大小为sizeCtl或者默认值
赋值然后设置sizeCtl为长度0.75倍
最后返回新Node数组
总得来说是CAS加自旋保证安全)*/
if (tab == null
concurrenthashmap1.8的put
最新推荐文章于 2024-11-25 10:34:25 发布