HashMap vs ConcurrentHashMap
引入ConcurrentHashMap
是為了在同步集合HashTable之間有更好的選擇报辱,HashTable
與HashMap
、ConcurrentHashMap
主要的區(qū)別在于HashMap不是同步的单山、線程不安全的和不適合應用于多線程并發(fā)環(huán)境下碍现,而ConcurrentHashMap
是線程安全的集合容器,特別是在多線程和并發(fā)環(huán)境中饥侵,通常作為Map
的主要實現(xiàn)鸵赫。除了線程安全外衣屏,他們之間還有一些細微的不同躏升,本文會介紹到。順便說說狼忱,HashMap
和ConcurrentHashMap
還有ConcurrentHashMap
和Hashtable
兩者之間的區(qū)別在Java面試中經常出現(xiàn)膨疏,特別是高級Java程序員。
HashMap與ConcurrentHashMap的區(qū)別
在這部分钻弄,我們會看到更多關于HashMap
和ConcurrentHashMap
的細節(jié)和對比它們之間的參數比如線程安全佃却、同步、性能和基本的使用窘俺。
- 就像上面所說他們之間的第一個重要的區(qū)別就是
ConcurrentHashMap
是線程安全的和在并發(fā)環(huán)境下不需要加額外的同步饲帅。雖然它不像Hashtable
那樣需要同樣的同步等級(全表鎖),但也有很多實際的用途瘤泪。 - 你可以使用
Collections.synchronizedMap(HashMap)
來包裝HashMap作為同步容器灶泵,這時它的作用幾乎與Hashtable
一樣,當每次對Map
做修改操作的時候都會鎖住這個Map
對象,而ConcurrentHashMap
會基于并發(fā)的等級來劃分整個Map來達到線程安全对途,它只會鎖操作的那一段數據而不是整個Map
都上鎖赦邻。 -
ConcurrentHashMap
有很好的擴展性,在多線程環(huán)境下性能方面比做了同步的HashMap
要好实檀,但是在單線程環(huán)境下惶洲,HashMap
會比ConcurrentHashMap
好一點。
總結一下以上兩者的區(qū)別膳犹,它們在線程安全恬吕、擴展性、同步之間的區(qū)別须床。如果是用于緩存的話铐料,ConcurrentHashMap
是一個更好的選擇,在Java應用中會經常用到。ConcurrentHashMap
在讀操作線程數多于寫操作線程數的情況下更勝一籌余赢。
ConcurrentHashMap vs Hashtable vs Synchronized Map
雖然三個集合類在多線程并發(fā)應用中都是線程安全的芯义,但是他們有一個重大的差別,就是他們各自實現(xiàn)線程安全的方式妻柒。Hashtable
是jdk1的一個遺棄的類扛拨,它把所有方法都加上synchronized
關鍵字來實現(xiàn)線程安全。所有的方法都同步這樣造成多個線程訪問效率特別低举塔。Synchronized Map
與HashTable
差別不大绑警,也是在并發(fā)中作類似的操作,兩者的唯一區(qū)別就是Synchronized Map
沒被遺棄央渣,它可以通過使用Collections.synchronizedMap()
來包裝Map
作為同步容器使用计盒。
另一方面,ConcurrentHashMap
的設計有點特別芽丹,表現(xiàn)在多個線程操作上北启。它不用做外的同步的情況下默認同時允許16個線程讀和寫這個Map容器。因為其內部的實現(xiàn)剝奪了鎖拔第,使它有很好的擴展性咕村。不像HashTable
和Synchronized Map
,ConcurrentHashMap
不需要鎖整個Map蚊俺,相反它劃分了多個段(segments)懈涛,要操作哪一段才上鎖那段數據。
坦白說泳猬,集合類是一個最重要的Java API批钠,我覺得恰當的使用它們是一種藝術。依我個人經驗得封,我會使用ArrayList
這些容器來提高自己的Java程序的性能埋心,而不會去用一些遺棄的容器比如Vector
等等,在Java 5之前呛每,Java集合容器有一個很致命的缺陷就是缺乏可擴展性踩窖。
同步集合類比如Hashtable
和Vector
在多線程Java應用里面逐漸成為障礙物;在jdk5后出現(xiàn)一些很好的并發(fā)集合晨横,對大容量洋腮、低延遲的電子交易系統(tǒng)有很大影響,是快速存取數據的支柱手形。
原文地址:
ConcurrentHashMap和HashMap的區(qū)別
ConcurrentHashMap vs Hashtable vs Synchronized Map