ConcurrentHashMap底層原始碼實現

2021-10-10 22:38:27 字數 916 閱讀 3152

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...