elasticsearch入門系列">elasticsearch入門系列
701
2022-05-30
祝大家變得更強
~
ConcurrentHashMap源碼解析_01 成員屬性、內部類、構造方法分析
ConcurrentHashMap源碼解析_02 預熱(內部一些小方法分析)
ConcurrentHashMap源碼解析_03 put方法源碼分析
ConcurrentHashMap源碼解析_04 transfer方法源碼分析(難點)
ConcurrentHashMap源碼解析_05 get、remove方法
ConcurrentHashMap源碼解析_06 紅黑樹的代理類(TreeBin)
下面是引用彤哥源碼公眾號文章中的片段: ConcurrentHashMap完整小節 上對并發HashMap的簡單總結~
總結:
(1)ConcurrentHashMap是HashMap的線程安全版本;
(2)ConcurrentHashMap采用(數組 + 鏈表 + 紅黑樹)的結構存儲元素;
(3)ConcurrentHashMap相比于同樣線程安全的HashTable,效率要高很多;
(4)ConcurrentHashMap采用的鎖有 synchronized,CAS,自旋鎖,分段鎖,volatile等;
(5)ConcurrentHashMap中沒有threshold和loadFactor這兩個字段,而是采用sizeCtl來控制;
(6)sizeCtl = -1,表示正在進行初始化;
(7)sizeCtl = 0,默認值,表示后續在真正初始化的時候使用默認容量;
(8)sizeCtl > 0,在初始化之前存儲的是傳入的容量,在初始化或擴容后存儲的是下一次的擴容門檻;
(9)sizeCtl = (resizeStamp << 16) + (1 + nThreads),表示正在進行擴容,高位存儲擴容郵戳,低位存儲擴容線程數加1;
(10)更新操作時如果正在進行擴容,當前線程協助擴容;
(11)更新操作會采用synchronized鎖住當前桶的第一個元素,這是分段鎖的思想;
(12)整個擴容過程都是通過CAS控制sizeCtl這個字段來進行的,這很關鍵;
(13)遷移完元素的桶會放置一個ForwardingNode節點,以標識該桶遷移完畢;
(14)元素個數的存儲也是采用的分段思想,類似于LongAdder的實現;
(15)元素個數的更新會把不同的線程hash到不同的段上,減少資源爭用;
(16)元素個數的更新如果還是出現多個線程同時更新一個段,則會擴容段(CounterCell);
(17)獲取元素個數是把所有的段(包括baseCount和CounterCell)相加起來得到的;
(18)查詢操作是不會加鎖的,所以ConcurrentHashMap不是強一致性的;
(19)ConcurrentHashMap中不能存儲key或value為null的元素;
ConcurrentHashMap中有哪些值得學習的技術呢?
(1)CAS + 自旋,樂觀鎖的思想,減少線程上下文切換的時間;
(2)分段鎖的思想,減少同一把鎖爭用帶來的低效問題;
(3)CounterCell,分段存儲元素個數,減少多線程同時更新一個字段帶來的低效;
(4)@sun.misc.Contended(CounterCell上的注解),避免偽共享;
(5)多線程協同進行擴容;
Java 任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。