ConcurrentHashMap的源码分析-CounterCells初始化图解
生活随笔
收集整理的這篇文章主要介紹了
ConcurrentHashMap的源码分析-CounterCells初始化图解
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
初始化長度為2的數(shù)組,然后隨機得到指定的一個數(shù)組下標,將需要新增的值加入到對應下標位置處
?transfer擴容階段
判斷是否需要擴容,也就是當更新后的鍵值對總數(shù)baseCount >= 閾值sizeCtl時,進行rehash,這里面會有兩個邏輯。
1. 如果當前正在處于擴容階段,則當前線程會加入并且協(xié)助擴容
2. 如果當前沒有在擴容,則直接觸發(fā)擴容操作
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,說明已經(jīng)有別的線程正在擴容了 //這5個條件只要有一個條件為true,說明當前線程不能幫助進行此次的擴容,直接跳出循環(huán) //sc >>> RESIZE_STAMP_SHIFT!=rs 表示比較高RESIZE_STAMP_BITS位生成戳和rs是否相等,相同 //sc=rs+1 表示擴容結(jié)束//sc==rs+MAX_RESIZERS 表示幫助線程線程已經(jīng)達到最大值了 //nt=nextTable -> 表示擴容已經(jīng)結(jié)束 //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))//當前線程嘗試幫助此次擴容,如果成功,則調(diào)用transfer transfer(tab, nt); } // 如果當前沒有在擴容,那么rs肯定是一個正數(shù),通過rs<<RESIZE_STAMP_SHIFT將sc設置為一個負數(shù),+2表示有一個線程在執(zhí)行擴容 else if (U.compareAndSwapInt(this, SIZECTL, sc, (rs << RESIZE_STAMP_SHIFT) + 2)) transfer(tab, null); s = sumCount(); // 重新計數(shù),判斷是否需要開啟下一輪擴容 } }?
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結(jié)
以上是生活随笔為你收集整理的ConcurrentHashMap的源码分析-CounterCells初始化图解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ConcurrentHashMap的源码
- 下一篇: ConcurrentHashMap的源码