在這部分,我們會看到更多關於 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