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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

ConcurrentHashMap的源码分析-addCount

發(fā)布時間:2024/4/13 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ConcurrentHashMap的源码分析-addCount 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在putVal最后調(diào)用addCount的時候,傳遞了兩個參數(shù),分別是1和binCount(鏈表長度),看看addCount方法里面做了什么操作

x表示這次需要在表中增加的元素個數(shù),check參數(shù)表示是否需要進行擴容檢查,大于等于0都需要進行檢查

private final void addCount(long x, int check) { CounterCell[] as; long b, s;判斷counterCells是否為空,1. 如果為空,就通過cas操作嘗試修改baseCount變量,對這個變量進行原子累加操作(做這個操作的意義是:如果在沒有競爭的情況下,仍然采用baseCount來記錄元素個數(shù)) 2. 如果cas失敗說明存在競爭,這個時候不能再采用baseCount來累加,而是通過CounterCell來記錄if ((as = counterCells) != null || !U.compareAndSwapLong(this, BASECOUNT, b = baseCount, s = b + x)){ CounterCell a; long v; int m; boolean uncontended = true;//是否沖突標識,默認為沒有沖突 這里有幾個判斷 1. 計數(shù)表為空則直接調(diào)用fullAddCount 2. 從計數(shù)表中隨機取出一個數(shù)組的位置為空,直接調(diào)用fullAddCount 3. 通過CAS修改CounterCell隨機位置的值,如果修改失敗說明出現(xiàn)并發(fā)情況(這里又用到了一種巧妙的方法),調(diào)用fullAndCount Random在線程并發(fā)的時候會有性能問題以及可能會產(chǎn)生相同的隨機數(shù),ThreadLocalRandom.getProbe可以解決這個問題,并且性能要比Random高 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);//執(zhí)行fullAddCount方法 return; } if (check <= 1)//鏈表長度小于等于1,不需要考慮擴容 return; s = sumCount();//統(tǒng)計ConcurrentHashMap元素個數(shù) } //…. }

?

總結

以上是生活随笔為你收集整理的ConcurrentHashMap的源码分析-addCount的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。