ConCurrentHashMap(基於jdk1.8源碼)(轉載來源https://segmentfault.com/a/1190000014380257)

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個操做數併發

      • 內存值V
      • 舊的預期值A
      • 要修改的新值B

      當且僅當預期值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
相關文章
相關標籤/搜索