ConcurrentHashMap? 1.8 使用synchronized 和CAS 實現?
記住:1.8沒有分段鎖不要混淆了,分段鎖是1.7中的
final V putVal(K key, V value, boolean onlyIfAbsent) {if (key == null || value == null) throw new NullPointerException();//計算hashint hash = spread(key.hashCode());int binCount = 0;for (Node<K,V>[] tab = table;;) {Node<K,V> f; int n, i, fh;//判斷map中是否有元素,沒有進行初始化if (tab == null || (n = tab.length) == 0)tab = initTable();//(n - 1) & hash 等價于 hash % n ,此處用于計算下標并獲取Node,node 維護的是map 的元素else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) {//如果條件滿足,說明這個下標位沒有數據,可以進行替換//但是考慮到多線程等情況,此處使用原子類進行替換if (casTabAt(tab, i, null,new Node<K,V>(hash, key, value, null)))//替換成功直接退出break; // no lock when adding to empty bin//如果失敗說明被其它線程搶先完成了操作,那么在下一次循環中進行}// 這里判斷的是map是否需要擴容else if ((fh = f.hash) == MOVED)//進行擴容操作tab = helpTransfer(tab, f);else {//進入到這里說明發生了hash碰撞,此時需要進行鏈表操作V oldVal = null;//加鎖在鏈表的第一個元素上,這樣相當于鎖住了整個鏈表synchronized (f) {//此處是為了防止鏈表轉換為紅黑樹,如果判斷為false,則在下一次循環中操作 if (tabAt(tab, i) == f) {//進行添加元素if (fh >= 0) {binCount = 1;for (Node<K,V> e = f;; ++binCount) {K ek;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;}}}//此處說明為紅黑樹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;}}}}if (binCount != 0) {//此處判斷鏈表的元素個數是否大于8,如果滿足將鏈表轉為紅黑樹if (binCount >= TREEIFY_THRESHOLD)treeifyBin(tab, i);if (oldVal != null)return oldVal;break;}}}addCount(1L, binCount);return null;}