ConcurrentHashMap的源码分析-put方法第四阶段
生活随笔
收集整理的這篇文章主要介紹了
ConcurrentHashMap的源码分析-put方法第四阶段
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這個方法的主要作用是,如果被添加的節點的位置已經存在節點的時候,需要以鏈表的方式加入到節點中?
如果當前節點已經是一顆紅黑樹,那么就會按照紅黑樹的規則將當前節點加入到紅黑樹中
else { //進入到這個分支,說明f是當前nodes數組對應位置節點的頭節點,并且不為空 V oldVal = null; synchronized (f) { //給對應的頭結點加鎖 if (tabAt(tab, i) == f) {//再次判斷對應下標位置是否為f節點 if (fh >= 0) { //頭結點的hash值大于0,說明是鏈表 binCount = 1; //用來記錄鏈表的長度 for (Node<K,V> e = f;; ++binCount) {//遍歷鏈表 K ek; //如果發現相同的key,則判斷是否需要進行值的覆蓋 if (e.hash == hash && ((ek = e.key) == key || (ek != null && key.equals(ek)))) { oldVal = e.val; if (!onlyIfAbsent) //默認情況下,直接覆蓋舊的值 e.val = value; break; } //一直遍歷到鏈表的最末端,直接把新的值加入到鏈表的最后面 Node<K,V> pred = e; if ((e = e.next) == null) { pred.next = new Node<K,V>(hash, key, value, null); break; } } } //如果當前的f節點是一顆紅黑樹 else if (f instanceof TreeBin) { Node<K,V> p; binCount = 2; //則調用紅黑樹的插入方法插入新的值 if ((p = ((TreeBin<K,V>)f).putTreeVal(hash, key, value)) != null) { oldVal = p.val; //同樣,如果值已經存在,則直接替換 if (!onlyIfAbsent) p.val = value; } } } }?
總結
以上是生活随笔為你收集整理的ConcurrentHashMap的源码分析-put方法第四阶段的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RestTemplate技术预研-认识R
- 下一篇: ConcurrentHashMap的源码