久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx

concurrenthashmap你經常用,但你可能并不了解

2021-03-14    分類: 網站建設

ConcurrentHashMap 和 HashMap 思路是差不多的,但是因為它支持并發操作,所以要復雜一些。

整個 ConcurrentHashMap 由一個個 Segment 組成,Segment 代表”部分“或”一段“的意思,所以很多地方都會將其描述為分段鎖。注意,行文中,我很多地方用了“槽”來代表一個 segment。

簡單理解就是,ConcurrentHashMap 是一個 Segment 數組,Segment 通過繼承 ReentrantLock 來進行加鎖,所以每次需要加鎖的操作鎖住的是一個 segment,這樣只要保證每個 Segment 是線程安全的,也就實現了全局的線程安全。

concurrentha

concurrencyLevel:并行級別、并發數、Segment 數,怎么翻譯不重要,理解它。默認是 16,也就是說 ConcurrentHashMap 有 16 個 Segments,所以理論上,這個時候,最多可以同時支持 16 個線程并發寫,只要它們的操作分別分布在不同的 Segment 上。這個值可以在初始化的時候設置為其他值,但是一旦初始化以后,它是不可以擴容的。

再具體到每個 Segment 內部,其實每個 Segment 很像之前介紹的 HashMap,不過它要保證線程安全,所以處理起來要麻煩些。

初始化

initialCapacity:初始容量,這個值指的是整個 ConcurrentHashMap 的初始容量,實際操作的時候需要平均分給每個 Segment。

loadFactor:負載因子,之前我們說了,Segment 數組不可以擴容,所以這個負載因子是給每個 Segment 內部使用的。

concurrentha

初始化完成,我們得到了一個 Segment 數組。

我們就當是用 new ConcurrentHashMap() 無參構造函數進行初始化的,那么初始化完成后:

  • Segment 數組長度為 16,不可以擴容
  • Segment[i] 的默認大小為 2,負載因子是 0.75,得出初始閾值為 1.5,也就是以后插入第一個元素不會觸發擴容,插入第二個會進行第一次擴容
  • 這里初始化了 segment[0],其他位置還是 null,至于為什么要初始化 segment[0],后面的代碼會介紹
  • 當前 segmentShift 的值為 32 – 4 = 28,segmentMask 為 16 – 1 = 15,姑且把它們簡單翻譯為移位數和掩碼,這兩個值馬上就會用到

put 過程分析

我們先看 put 的主流程,對于其中的一些關鍵細節操作,后面會進行詳細介紹。

concurrentha

第一層皮很簡單,根據 hash 值很快就能找到相應的 Segment,之后就是 Segment 內部的 put 操作了。

Segment 內部是由 數組+鏈表 組成的。

concurrentha

整體流程還是比較簡單的,由于有獨占鎖的保護,所以 segment 內部的操作并不復雜。至于這里面的并發問題,我們稍后再進行介紹。

到這里 put 操作就結束了,接下來,我們說一說其中幾步關鍵的操作。

初始化槽: ensureSegment

ConcurrentHashMap 初始化的時候會初始化第一個槽 segment[0],對于其他槽來說,在插入第一個值的時候進行初始化。

這里需要考慮并發,因為很可能會有多個線程同時進來初始化同一個槽 segment[k],不過只要有一個成功了就可以。

concurrentha

總的來說,ensureSegment(int k) 比較簡單,對于并發操作使用 CAS 進行控制。

我沒搞懂這里為什么要搞一個 while 循環,CAS 失敗不就代表有其他線程成功了嗎,為什么要再進行判斷?

獲取寫入鎖: scanAndLockForPut

前面我們看到,在往某個 segment 中 put 的時候,首先會調用 node = tryLock() ? null : scanAndLockForPut(key, hash, value),也就是說先進行一次 tryLock() 快速獲取該 segment 的獨占鎖,如果失敗,那么進入到 scanAndLockForPut 這個方法來獲取鎖。

下面我們來具體分析這個方法中是怎么控制加鎖的。

concurrentha

這個方法有兩個出口,一個是 tryLock() 成功了,循環終止,另一個就是重試次數超過了 MAX_SCAN_RETRIES,進到 lock() 方法,此方法會阻塞等待,直到成功拿到獨占鎖。

這個方法就是看似復雜,但是其實就是做了一件事,那就是獲取該 segment 的獨占鎖,如果需要的話順便實例化了一下 node。

擴容: rehash

重復一下,segment 數組不能擴容,擴容是 segment 數組某個位置內部的數組 HashEntry\[] 進行擴容,擴容后,容量為原來的 2 倍。

首先,我們要回顧一下觸發擴容的地方,put 的時候,如果判斷該值的插入會導致該 segment 的元素個數超過閾值,那么先進行擴容,再插值,讀者這個時候可以回去 put 方法看一眼。

該方法不需要考慮并發,因為到這里的時候,是持有該 segment 的獨占鎖的。

concurrentha

這里的擴容比之前的 HashMap 要復雜一些,代碼難懂一點。上面有兩個挨著的 for 循環,第一個 for 有什么用呢?

仔細一看發現,如果沒有第一個 for 循環,也是可以工作的,但是,這個 for 循環下來,如果 lastRun 的后面還有比較多的節點,那么這次就是值得的。因為我們只需要克隆 lastRun 前面的節點,后面的一串節點跟著 lastRun 走就是了,不需要做任何操作。

我覺得 Doug Lea 的這個想法也是挺有意思的,不過比較壞的情況就是每次 lastRun 都是鏈表的最后一個元素或者很靠后的元素,那么這次遍歷就有點浪費了。不過 Doug Lea 也說了,根據統計,如果使用默認的閾值,大約只有 1/6 的節點需要克隆。

get 過程分析

相對于 put 來說,get 真的不要太簡單。

  1. 計算 hash 值,找到 segment 數組中的具體位置,或我們前面用的“槽”
  2. 槽中也是一個數組,根據 hash 找到數組中具體的位置
  3. 到這里是鏈表了,順著鏈表進行查找即可
concurrentha

并發問題分析

現在我們已經說完了 put 過程和 get 過程,我們可以看到 get 過程中是沒有加鎖的,那自然我們就需要去考慮并發問題。

添加節點的操作 put 和刪除節點的操作 remove 都是要加 segment 上的獨占鎖的,所以它們之間自然不會有問題,我們需要考慮的問題就是 get 的時候在同一個 segment 中發生了 put 或 remove 操作。

  1. put 操作的線程安全性。
    • 初始化槽,這個我們之前就說過了,使用了 CAS 來初始化 Segment 中的數組。
    • 添加節點到鏈表的操作是插入到表頭的,所以,如果這個時候 get 操作在鏈表遍歷的過程已經到了中間,是不會影響的。當然,另一個并發問題就是 get 操作在 put 之后,需要保證剛剛插入表頭的節點被讀取,這個依賴于 setEntryAt 方法中使用的 UNSAFE.putOrderedObject。
    • 擴容。擴容是新創建了數組,然后進行遷移數據,最后面將 newTable 設置給屬性 table。所以,如果 get 操作此時也在進行,那么也沒關系,如果 get 先行,那么就是在舊的 table 上做查詢操作;而 put 先行,那么 put 操作的可見性保證就是 table 使用了 volatile 關鍵字。
  2. remove 操作的線程安全性。

    remove 操作我們沒有分析源碼,所以這里說的讀者感興趣的話還是需要到源碼中去求實一下的。

    get 操作需要遍歷鏈表,但是 remove 操作會”破壞”鏈表。

    如果 remove 破壞的節點 get 操作已經過去了,那么這里不存在任何問題。

    如果 remove 先破壞了一個節點,分兩種情況考慮。 1、如果此節點是頭結點,那么需要將頭結點的 next 設置為數組該位置的元素,table 雖然使用了 volatile 修飾,但是 volatile 并不能提供數組內部操作的可見性保證,所以源碼中使用了 UNSAFE 來操作數組,請看方法 setEntryAt。2、如果要刪除的節點不是頭結點,它會將要刪除節點的后繼節點接到前驅節點中,這里的并發保證就是 next 屬性是 volatile 的。

網站題目:concurrenthashmap你經常用,但你可能并不了解
文章源于:http://www.js-pz168.com/news11/105161.html

成都網站建設公司_創新互聯,為您提供Google企業網站制作外貿建站微信小程序網站建設移動網站建設

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

搜索引擎優化
久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx
精品久久久久久无| 亚洲婷婷综合色高清在线| 中文字幕在线一区二区三区| 亚洲综合在线视频| 久久99国产精品免费网站| aaa欧美日韩| 欧美系列一区| 欧美日韩一区二区电影| 久久久久久久av麻豆果冻| 亚洲免费观看高清在线观看| 久久成人羞羞网站| av在线不卡一区| 夜夜爽99久久国产综合精品女不卡| 欧美年轻男男videosbes| 国产视频视频一区| 日本系列欧美系列| 91久久精品一区二区别| 亚洲一区二区在线看| 日韩欧美国产一区二区三区 | 一本色道久久综合亚洲二区三区| 欧美一级片在线观看| 亚洲日本中文字幕区| 国内偷窥港台综合视频在线播放| 国产精品乱码视频| 欧美亚洲另类激情小说| 中文在线一区二区| 美女视频网站久久| 国产精品一区二区欧美黑人喷潮水| 综合操久久久| 国产欧美精品在线观看| 麻豆一区二区三| 激情小说网站亚洲综合网| 欧美日韩高清一区| 亚洲视频电影在线| 国产不卡视频在线观看| 日韩亚洲欧美精品| 久久人人97超碰com| 日韩va亚洲va欧美va久久| 99久久99| 在线成人午夜影院| 一区二区三区高清| 99视频一区二区| 91久久国产综合久久| 国产精品嫩草影院av蜜臀| 国内成人免费视频| 日本午夜精品一区二区| 亚洲精品在线观看视频| 青娱乐精品视频在线| 国产精品美女黄网| 91精品国产综合久久久久久漫画| 一区二区三区四区亚洲| 99国产精品久久久久久久久久| 色婷婷久久综合| 亚洲欧洲日本在线| av亚洲产国偷v产偷v自拍| 91久久人澡人人添人人爽欧美| 国产精品国产三级国产| 成人精品在线视频观看| 欧美综合亚洲图片综合区| 自拍偷在线精品自拍偷无码专区| 成人av动漫在线| 欧美在线不卡视频| 亚洲一区二区三区国产| 国产乱人伦精品一区二区| 日韩视频一区二区在线观看| 免费观看一级欧美片| 久久av一区二区| 久久九九国产精品| 国产福利一区二区三区| 在线视频国内自拍亚洲视频| 夜夜嗨av一区二区三区网页| 俄罗斯精品一区二区三区| 欧美一级高清片在线观看| 青椒成人免费视频| 婷婷久久伊人| 亚洲欧美激情小说另类| 91老司机福利 在线| 欧美一区二区三区系列电影| 蜜臀av一级做a爰片久久| 亚洲国产精品综合| 一区二区三区丝袜| 久久久久久99| 国产精品美女久久久久高潮| eeuss国产一区二区三区| 欧美伦理视频网站| 九九**精品视频免费播放| 中文字幕精品一区日韩| 亚洲一二三专区| 麻豆视频成人| 中文字幕一区在线| 国产98在线|日韩| 欧美精品一区二区三区蜜桃| 国产999精品久久久久久| 欧美日韩国产欧美日美国产精品| 欧美a级理论片| 影音先锋在线亚洲| 午夜精品久久一牛影视| 欧洲精品码一区二区三区免费看| 综合激情成人伊人| 精品日本一区二区三区| 国产精品毛片a∨一区二区三区| 91色.com| 久久精品亚洲一区二区三区浴池| av亚洲精华国产精华精华| 精品欧美乱码久久久久久 | 亚洲成av人片在线观看无码| 日本精品一区二区三区高清 久久| 亚洲人午夜精品天堂一二香蕉| av在线不卡一区| 国产精品丝袜91| 国产尤物99| 亚洲天天做日日做天天谢日日欢| 国外成人在线视频网站| 亚洲欧美综合在线精品| 久久av二区| 亚洲一区二区精品视频| 一本一生久久a久久精品综合蜜 | 亚洲欧洲三级电影| 国产精品免费观看高清| 国产清纯美女被跳蛋高潮一区二区久久w| 成人一区在线观看| 欧美一区二区在线视频| 成人综合在线网站| 精品黑人一区二区三区久久| 成人黄色在线看| 精品国产污污免费网站入口 | 一本久久a久久精品vr综合| 亚洲精品国久久99热| 蜜桃在线一区二区三区精品| 亚洲视频香蕉人妖| 牛人盗摄一区二区三区视频 | 99久久久精品| 久久综合久久鬼色| 成人av网站免费观看| 久久综合久久综合久久综合| 91小视频在线| 国产精品系列在线| 国产日韩一区欧美| 国产精品电影一区二区| 日韩一区免费观看| 日韩精品高清不卡| 欧美性大战久久久| 国产大片一区二区| 国产日韩欧美麻豆| 精品久久久三级| 亚洲午夜免费福利视频| 亚洲乱码一区二区三区| 麻豆freexxxx性91精品| 91精品国产91久久综合桃花| 成人av小说网| 国产精品女主播av| 日韩欧美第二区在线观看| 日本中文字幕一区二区有限公司| 婷婷精品国产一区二区三区日韩| 久久99久久久久久久久久久| 在线不卡欧美精品一区二区三区| 成人一区二区在线观看| 国产欧美日韩综合精品一区二区| 欧美日本国产精品| 免费视频最近日韩| 日韩一区二区视频| 99国产在线| 亚洲精品高清视频在线观看| 在线中文字幕一区二区| 国产精品1区2区| 国产女人18毛片水真多成人如厕| 免费成人av网站| 美腿丝袜一区二区三区| 欧美大白屁股肥臀xxxxxx| 国产精品一区二区三区四区五区 | 日韩一区二区中文字幕| 99精品欧美一区二区三区| 亚洲猫色日本管| 色菇凉天天综合网| 91在线免费播放| 亚洲精品精品亚洲| 91官网在线观看| www.欧美精品一二区| 一区二区免费看| 欧美二区在线观看| 国产精品视频免费一区二区三区| 亚洲第四色夜色| 91精品国产色综合久久不卡蜜臀 | 精品999在线观看| 污片在线观看一区二区| 91精品国产综合久久久久| 成人性色av| 日韩国产欧美三级| 欧美不卡一区二区三区四区| 久久99精品久久久久久三级| 午夜精品一区二区三区电影天堂| 精品日韩在线观看| 免费看污久久久| 国产一区二区三区综合| 国产精品久久一级| 欧美中文字幕不卡| 成人免费看片网站| 天使萌一区二区三区免费观看| 日韩欧美一区电影| 久久香蕉综合色|