2009-08-18 69 views

回答

64

同步HashMap

  1. 每種方法使用對象級鎖同步。所以synchMap上的get和put方法獲得一個鎖。

  2. 鎖定整個集合是一個性能開銷。當一個線程保持鎖定狀態時,其他線程不能使用該集合。

ConcurrentHashMap是在JDK 5.

  1. 引入有在對象級別沒有鎖定,該鎖定是在一個更精細的粒度。對於ConcurrentHashMap,鎖可能位於散列映射存儲桶級別。

  2. 較低級別鎖定的效果是,您可以使同步讀取器和寫入器不可能用於同步集合。這導致更多的可擴展性。

  3. ConcurrentHashMap不會拋出ConcurrentModificationException如果一個線程試圖修改它,而另一個線程迭代它。

這篇文章Java 7: HashMap vs ConcurrentHashMap是一個很好的閱讀。強烈推薦。在SynchronizedMap

+3

那麼'Hashtable'和'Synchronized HashMap'有什麼區別? – roottraveller 2017-07-11 06:47:48

+0

在ConcurrentHashMap和Synchronized HashMap之間,你推薦哪一個? – Blunderchips 2017-11-25 14:16:55

76

簡短的回答:

兩個地圖是Map接口的線程安全的實現。在期望高併發性的情況下實現更高吞吐量的ConcurrentHashMap

Brian Goetz的article關於背後的想法ConcurrentHashMap是一個非常好的閱讀。強烈推薦。

+0

這是什麼? HashMap的:請注意,此實現不是同步的 ,以防止意外的非同步訪問地圖: '地圖M = Collections.synchronizedMap(新的HashMap(...));' 的http://文檔。 oracle.com/javase/7/docs/api/java/util/HashMap.html – karate 2014-10-21 16:23:09

+3

「Brian Goetz的文章......是一篇很好的文章。」 - 他的「Java併發實踐」一書更是如此。 – 2015-07-28 14:41:37

24

ConcurrentHashMap是線程安全的,沒有同步整個地圖。讀取可以非常快速地進行,而寫入是通過鎖定完成的。

5

ConcurrentHashMap使用稱爲lock stripping的細粒度鎖定機制允許更大程度的共享訪問。由於這個原因,它提供了更好的併發性可擴展性

而且迭代器返回ConcurrentHashMap弱一致,而不是失敗的同步HashMap的使用快速的技術

2

方法持有對象的鎖,而在ConcurrentHashMap有其中持有鎖上的內容,而不是桶「鎖條帶化」的概念。從而提高了可擴展性和性能。

1

的ConcurrentHashMap:

1)兩個地圖是Map接口的線程安全的實現。

2)ConcurrentHashMap在預計高併發的情況下實現更高的吞吐量。

3)對象級別沒有鎖定。

同步散列映射:

1)每種方法使用對象級鎖同步。

7

兩者都是HashMap的同步版本,它們的核心功能和內部結構有所不同。

ConcurrentHashMap由內部分段組成,可以從概念上看作獨立的HashMap。 所有這些段可以由高併發執行中的單獨線程鎖定。 因此,多線程可以從ConcurrentHashMap獲取/放置鍵/值對,而不會相互阻塞/等待。 這是實現更高的吞吐量。

Collections.synchronizedMap(),我們得到的HashMap的同步版本,它是在封閉的方式進行訪問。這意味着如果多個線程同時嘗試訪問synchronizedMap,它們將被允許以同步的方式一次一個地獲取/放置鍵值對。

5

我們可以通過使用ConcurrentHashMap和synchronisedHashmap來實現線程安全。但是,如果你看看他們的架構,就會有很多不同。

  1. synchronisedHashmap

將維持在對象級別的鎖。所以如果你想執行任何操作,比如put/get,那麼你必須先獲得鎖。同時,其他線程不允許執行任何操作。因此,一次只有一個線程可以對此進行操作。所以等待時間會在這裏增加。當你比較ConcurrentHashMap時,我們可以說性能相對較低。

  • 的ConcurrentHashMap
  • 它將保持在片段級別的鎖。它有16個段,默認情況下併發級別保持爲16。因此,一次有16個線程可以在ConcurrentHashMap上運行。而且,讀取操作不需要鎖定。所以任何數量的線程都可以對它執行get操作。

    如果thread1想要在段2中執行put操作並且thread2想要在段4上執行put操作,那麼它在這裏是允許的。意思是說,16個線程一次可以對ConcurrentHashMap執行更新(放入/刪除)操作。

    這樣等待時間就會少一些。因此,性能比同步的Hashmap要好。

    0

    的ConcurrentHashMap允許數據的並行訪問。整個地圖被分成幾部分。

    閱讀操作ie。即使在細分層面,get(Object key)也不同步。

    但寫入操作即。 remove(Object key), get(Object key)在段級別獲取鎖定。只有整個映射的一部分被鎖定,其他線程仍然可以讀取除鎖定之外的各個段的值。

    SynchronizedMap另一方面,在對象級別獲取鎖定。所有線程都應該等待當前線程,而不管操作如何(讀/寫)。