ConCurrentHashMap的底層是:散列表+紅黑樹,與HashMap是同樣的。(不容許key和value是null值)算法
- JDK1.8底層是散列表+紅黑樹
- ConCurrentHashMap支持高併發的訪問和更新,它是線程安全的
- 檢索操做不用加鎖,get方法是非阻塞的
- key和value都不容許爲null
-
有了Hashtable爲啥須要ConCurrentHashMap
- Hashtable是在每一個方法上都加上了Synchronized完成同步,效率低下。
- ConcurrentHashMap經過在部分加鎖和利用CAS算法來實現同步。
-
CAS算法和volatile簡單介紹
在看ConCurrentHashMap源碼以前,咱們來簡單講講CAS算法和volatile關鍵字數組
CAS(比較與交換,Compare and swap) 是一種有名的無鎖算法安全
CAS有3個操做數併發
當且僅當預期值A和內存值V相同時,將內存值V修改成B,不然什麼都不作高併發
- 當多個線程嘗試使用CAS同時更新同一個變量時,只有其中一個線程能更新變量的值(A和內存值V相同時,將內存值V修改成B),而其它線程都失敗,失敗的線程並不會被掛起,而是被告知此次競爭中失敗,並能夠再次嘗試(不然什麼都不作)
看了上面的描述應該就很容易理解了,先比較是否相等,若是相等則替換(CAS算法).net
- volatile經典總結:volatile僅僅用來保證該變量對全部線程的可見性,但不保證原子性
- 小結:
-
- 底層結構是散列表(數組+鏈表)+紅黑樹,這一點和HashMap是同樣的。
- Hashtable是將全部的方法進行同步,效率低下。而ConcurrentHashMap做爲一個高併發的容器,它是經過部分鎖定+CAS算法來進行實現線程安全的。CAS算法也能夠認爲是樂觀鎖的一種~
- 在高併發環境下,統計數據(計算size...等等)實際上是無心義的,由於在下一時刻size值就變化了。
- get方法是非阻塞,無鎖的。重寫Node類,經過volatile修飾next來實現每次獲取都是最新設置的值
- ConcurrentHashMap的key和Value都不能爲null
- 詳解參考:https://blog.csdn.net/u010723709/article/details/48007881