日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ConcurrentHashMap的源码分析-CounterCells初始化图解

發布時間:2024/4/13 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ConcurrentHashMap的源码分析-CounterCells初始化图解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

初始化長度為2的數組,然后隨機得到指定的一個數組下標,將需要新增的值加入到對應下標位置處

?transfer擴容階段

判斷是否需要擴容,也就是當更新后的鍵值對總數baseCount >= 閾值sizeCtl時,進行rehash,這里面會有兩個邏輯。

1. 如果當前正在處于擴容階段,則當前線程會加入并且協助擴容

2. 如果當前沒有在擴容,則直接觸發擴容操作

if (check >= 0) {//如果binCount>=0,標識需要檢查擴容 Node<K,V>[] tab, nt; int n, sc; //s標識集合大小,如果集合大小大于或等于擴容閾值(默認值的0.75) //并且table不為空并且table的長度小于最大容量 while (s >= (long)(sc = sizeCtl) && (tab = table) != null && (n = tab.length) < MAXIMUM_CAPACITY) { int rs = resizeStamp(n);//這里是生成一個唯一的擴容戳,這個是干嘛用的呢?且聽我慢慢分析 if (sc < 0) {//sc<0,也就是sizeCtl<0,說明已經有別的線程正在擴容了 //這5個條件只要有一個條件為true,說明當前線程不能幫助進行此次的擴容,直接跳出循環 //sc >>> RESIZE_STAMP_SHIFT!=rs 表示比較高RESIZE_STAMP_BITS位生成戳和rs是否相等,相同 //sc=rs+1 表示擴容結束//sc==rs+MAX_RESIZERS 表示幫助線程線程已經達到最大值了 //nt=nextTable -> 表示擴容已經結束 //transferIndex<=0 表示所有的transfer任務都被領取完了,沒有剩余的hash桶來給自己自己好這個線程來做transfer if ((sc >>> RESIZE_STAMP_SHIFT) != rs || sc == rs + 1 || sc == rs + MAX_RESIZERS || (nt = nextTable) == null || transferIndex <= 0) break; if (U.compareAndSwapInt(this, SIZECTL, sc, sc + 1))//當前線程嘗試幫助此次擴容,如果成功,則調用transfer transfer(tab, nt); } // 如果當前沒有在擴容,那么rs肯定是一個正數,通過rs<<RESIZE_STAMP_SHIFT將sc設置為一個負數,+2表示有一個線程在執行擴容 else if (U.compareAndSwapInt(this, SIZECTL, sc, (rs << RESIZE_STAMP_SHIFT) + 2)) transfer(tab, null); s = sumCount(); // 重新計數,判斷是否需要開啟下一輪擴容 } }

?

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的ConcurrentHashMap的源码分析-CounterCells初始化图解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。