1.7 ConcurrentHashMap增删改查
ConcurrentHashMap線程安全并且提高性能原因就在于:對map中的讀是并發的,無需加鎖;只有在put、remove操作時才加鎖,而加鎖僅是對需要操作的segment加鎖,不會影響其他segment的讀寫,由此,不同的segment之間可以并發使用,極大地提高了性能。
-
查詢
第一次hash確定key在哪個segment中;第二次hash在segment中確定key在鏈表數組的哪個鏈表中;第三步遍歷這個鏈表,調用equals()進行比對,找到與所查找key相等的結點并讀取。
-
插入
首先由key值經過hash計算得到是哪個segment,如果segment大小以及到達閥值則擴容;然后再次hash確定key所在鏈表的數組下標,獲取鏈表頭;最后遍歷鏈表,如果找到相同的key的結點則更新value值,如果沒有則插入新結點;
-
刪除
首先由key經過hash確定所在segment;然后再hash確定具體的數組下標,獲得鏈表頭;最后遍歷鏈表,找到被刪除結點后,以被刪除結點的next結點開始建立新的鏈表,然后再把原鏈表頭直到被刪結點的前繼結點依次復制、插入新鏈表,最后把新鏈表頭設置為當前數組下標元素取代舊鏈表。
-
統計大小—Size()
?ConcurrentHashMap在統計size時,經歷了兩次遍歷:第一次不加鎖地遍歷所以segment,統計count和modCount的總和得到C1和M1;然后再次不加鎖地遍歷,得到C2和M2,比較M1和M2,如果修改次數沒有發生變化則說明兩次遍歷期間map沒有發生數量變化,那么C1就是可用的。如果M1不等于M2,則說明在統計過程中map的數量發生了變化,此時才采取最終手段——鎖住整個map進行統計。
總結
以上是生活随笔為你收集整理的1.7 ConcurrentHashMap增删改查的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阻塞非阻塞和同步异步
- 下一篇: HTTP协议长短连接以及无状态