2012-09-28 38 views
41

Java中的ConcurrentHashMap和Hashtable有什麼區別?Java中的ConcurrentHashMap和Hashtable

對於線程應用程序,哪個更高效?

+0

可能會有所幫助http://www.codercorp.com/blog/java/why-concurrenthashmap-is-better-than-hashtable-and-just-as-good-hashmap.html – kosa

+2

對於非線程應用程序,使用'HashMap'。 –

+0

另請參閱http://stackoverflow.com/a/40878/632951瞭解更多信息。 – Pacerier

回答

68

ConcurrentHashMap使用多個桶來存儲數據。這樣可以避免讀鎖,並且極大地提高了性能,優於HashTable。兩者都是線程安全的,但在ConcurrentHashMap中有明顯的性能優勢。

當您從ConcurrentHashMap使用get()讀取時,沒有鎖定,與所有操作都簡單同步的HashTable相反。 HashTable是在舊版本的Java中發佈的,而ConcurrentHashMap是java 5+的東西。

HashMap是在單線程應用程序中使用的最佳選擇。

+10

還有'ConcurrentHashMap.putIfAbsent()',它在舊的' Hashtable'。當你只從'ConcurrentHashMap'中讀取時,就沒有鎖定,與所有操作都簡單同步的'Hashtable'相反。 –

+0

@FrankPavageau在原始答案中添加了非常有用的評論。 – Algorithmist

53

的ConcurrentHashMap和Hashtable鎖定機構

  • Hashtable是屬於集合框架; ConcurrentHashMap屬於Executor框架。
  • Hashtable使用單鎖爲整個數據。 ConcurrentHashMap使用段級別上的多個鎖(默認爲16)而不是對象級別,即整個Map
  • ConcurrentHashMap鎖定僅適用於更新。在檢索的情況下,它允許完全併發,檢索反映最近完成的更新操作的結果。所以讀取可以非常快速地進行,而寫入則通過鎖定來完成。
  • ConcurrentHashMap不會拋出ConcurrentModificationException如果一個線程試圖修改它,而另一個線程迭代它並且不允許空值。
  • ConcurrentHashMap返回Iterator,它對併發修改是安全的(即迭代器將複製內部數據結構)。
  • ConcurrentHashMap使用數據庫碎片邏輯(Segment<K, V>[] segments)被稱爲併發級別,即將所述數據分成碎片(段)比穿每個碎片(段)鎖而不是把單個鎖定爲整個數據(Map )。默認值是16

要了解的ConcurrentHashMap技術上更請看看這個link

以下類推可以幫助你只有理解這個概念(沒有邏輯)

  • 假設HashtableConcurrentHashMap是兩種家庭。
  • Hashtable鎖住家的大門。
  • ConcurrentHashMap鎖定特定的房門而不是主門。

哪個更有效的線程應用程序?

ConcurrentHashMap對於線程應用程序更高效。

+0

很好的回答+彼得 – prayagupd

+0

很好地解釋 – RamBen

+2

首頁例子贏得了所有的理論:) –