古詩詞大全網 - 漢語詞典 - HashMap、ConcurrentHashMap、HashTable的區別

HashMap、ConcurrentHashMap、HashTable的區別

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

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

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

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

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

坦白說,集合類是壹個最重要的Java API,我覺得恰當的使用它們是壹種藝術。依我個人經驗,我會使用 ArrayList 這些容器來提高自己的Java程序的性能,而不會去用壹些遺棄的容器比如 Vector 等等,在Java 5之前,Java集合容器有壹個很致命的缺陷就是缺乏可擴展性。

同步集合類比如 Hashtable 和 Vector 在多線程Java應用裏面逐漸成為障礙物;在jdk5後出現壹些很好的並發集合,對大容量、低延遲的電子交易系統有很大影響,是快速存取數據的支柱。

原文地址:

ConcurrentHashMap和HashMap的區別

ConcurrentHashMap vs Hashtable vs Synchronized Map