concurrenthashmap底層原始碼實現
空構造方法;
常用方法put(k key,v value):
呼叫putval方法(key,value,false);
putval(key,value,false):
如果key或者value為空,則丟擲空指標異常,說明不能新增空值;定義hash為hash值spread(key.hashcode());
定義bincount為拉鍊法中鏈的值的多少,然後進入迴圈:
如果table為空或者大小為0,則執行inittable方法;
1如果f=tabat(tab,i= =n-1)&hash= =null(i為對hash取餘);則進入判斷castabat是否成功:成功就break;
2或者如果fh=f.hash==moved(-1);則tab=helptransfer(tab,f);
3否則執行:定義老的val=null,然後給f加上同步鎖(sync);如果fh大於等於0,bincount=1;執行一次加個1,就是設定值,如果原位置有值,key一樣就把值改掉,如果key不一樣,就放到下乙個;如果fh小於0,就判斷f是不是treebin,如果是就加乙個樹化的過程,變成乙個紅黑樹,如果樹化一致,就value,如果不一致,就放進去。
如果bincount不等於0;如果鍊錶長度大於等於樹化值,就把他樹化;如果老的val不等於null,就返回老的val;
然後呼叫addcount(1l,bincount)(檢查剛剛加進去的值是否正確,判斷是不是需要擴容;;防止多執行緒對同乙個內容新增),返回空
inittable():迴圈判斷table等於空或者長度為0,如果sc=sizectl小於0,則執行thread.yield()方法(搶占執行緒失敗,讓出執行緒執行權);sc=sizectl大於等於0,cas(this,siectl,sc,-1);tryfinally;然後return tab;
ConcurrentHashMap底層實現
concurrenthashmap融合了hashtable和hashmap二者的優勢 hashtable是做了同步的,hashmap沒有同步,所以hashmap在單執行緒情況下效率高,hashtable在多執行緒情況下,同步操作能保證程式執行的正確性 但是hashtable每次同步執行都要鎖住整個結...
ConcurrentHashMap原始碼分析
hashmap 先說hashmap,hashmap是執行緒不安全 的,在併發環境下,可能會形成環狀鍊錶 hashtable hashtable和hashmap的實現原理幾乎一樣,差別無非是1.hashtable不允許key和value為null 2.hashtable是執行緒安全的。但是hashta...
ConcurrentHashMap原始碼詳解
成員變數private static final int maximum capacity 1 30 private static final int default capacity 16 static final int max array size integer.max value 8 pr...