HashMap, HashTable, CurrentHashMap的區別

HashMap, HashTable, CurrentHashMap的區別

轉載:http://www.jianshu.com/p/c00308c32de4html

HashMap vs ConcurrentHashMap

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

HashMap與ConcurrentHashMap的區別

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

  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後出現一些很好的併發集合,對大容量、低延遲的電子交易系統有很大影響,是快速存取數據的支柱。安全

 





分類: java基礎
0
0
« 上一篇: CurrentHashMap的實現原理
» 下一篇: ArrayList實現原理
posted @ 2016-11-05 21:44 NewMan13 閱讀( 32) 評論( 0) 編輯 收藏
相關文章
相關標籤/搜索