HashMap、ConcurrentHashMap(1.7和1.8的不同實現)、HashTable的區別

談談ConcurrentHashMap1.7和1.8的不同實現

HashMap vs ConcurrentHashMap

引入ConcurrentHashMap是爲了在同步集合HashTable之間有更好的選擇,HashTableHashMapConcurrentHashMap主要的區別在於HashMap不是同步的、線程不安全的和不適合應用於多線程併發環境下,而ConcurrentHashMap是線程安全的集合容器,特別是在多線程和併發環境中,通常作爲Map的主要實現。除了線程安全外,他們之間還有一些細微的不同,本文會介紹到。順便說說,HashMapConcurrentHashMap還有ConcurrentHashMapHashtable兩者之間的區別在Java面試中經常出現,特別是高級Java程序員。

HashMap與ConcurrentHashMap的區別

在這部分,我們會看到更多關於HashMapConcurrentHashMap的細節和對比它們之間的參數比如線程安全、同步、性能和基本的使用。

  1. 就像上面所說他們之間的第一個重要的區別就是ConcurrentHashMap是線程安全的和在併發環境下不需要加額外的同步。雖然它不像Hashtable那樣需要同樣的同步等級(全表鎖),但也有很多實際的用途。
  2. 你可以使用Collections.synchronizedMap(HashMap)來包裝HashMap作爲同步容器,這時它的作用幾乎與Hashtable一樣,當每次對Map做修改操作的時候都會鎖住這個Map對象,而ConcurrentHashMap會基於併發的等級來劃分整個Map來達到線程安全,它只會鎖操作的那一段數據而不是整個Map都上鎖。
  3. ConcurrentHashMap有很好的擴展性,在多線程環境下性能方面比做了同步的HashMap要好,但是在單線程環境下,HashMap會比ConcurrentHashMap好一點。

總結一下以上兩者的區別,它們在線程安全、擴展性、同步之間的區別。如果是用於緩存的話,ConcurrentHashMap是一個更好的選擇,在Java應用中會經常用到。ConcurrentHashMap在讀操作線程數多於寫操作線程數的情況下更勝一籌。

ConcurrentHashMap vs Hashtable vs Synchronized Map

雖然三個集合類在多線程併發應用中都是線程安全的,但是他們有一個重大的差別,就是他們各自實現線程安全的方式。Hashtable是jdk1的一個遺棄的類,它把所有方法都加上synchronized關鍵字來實現線程安全。所有的方法都同步這樣造成多個線程訪問效率特別低。Synchronized MapHashTable差別不大,也是在併發中作類似的操作,兩者的唯一區別就是Synchronized Map沒被遺棄,它可以通過使用Collections.synchronizedMap()來包裝Map作爲同步容器使用。

另一方面,ConcurrentHashMap的設計有點特別,表現在多個線程操作上。它不用做外的同步的情況下默認同時允許16個線程讀和寫這個Map容器。因爲其內部的實現剝奪了鎖,使它有很好的擴展性。不像HashTableSynchronized MapConcurrentHashMap不需要鎖整個Map,相反它劃分了多個段(segments),要操作哪一段才上鎖那段數據。

坦白說,集合類是一個最重要的Java API,我覺得恰當的使用它們是一種藝術。依我個人經驗,我會使用ArrayList這些容器來提高自己的Java程序的性能,而不會去用一些遺棄的容器比如Vector等等,在Java 5之前,Java集合容器有一個很致命的缺陷就是缺乏可擴展性。
同步集合類比如HashtableVector在多線程Java應用裏面逐漸成爲障礙物;在jdk5後出現一些很好的併發集合,對大容量、低延遲的電子交易系統有很大影響,是快速存取數據的支柱。

原文地址:
ConcurrentHashMap和HashMap的區別
ConcurrentHashMap vs Hashtable vs Synchronized Map

HashMap、ConcurrentHashMap、HashTable的區別

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章