在HashMap
和ConcurrentHashMap
上使用包裝類SynchronizedMap
有什麼區別? 它只是能夠修改HashMap
而迭代它(ConcurrentHashMap
)?ConcurrentHashMap vs Synchronized HashMap
回答
同步HashMap
:
每種方法使用對象級鎖同步。所以synchMap上的get和put方法獲得一個鎖。
鎖定整個集合是一個性能開銷。當一個線程保持鎖定狀態時,其他線程不能使用該集合。
ConcurrentHashMap
是在JDK 5.
引入有在對象級別沒有鎖定,該鎖定是在一個更精細的粒度。對於
ConcurrentHashMap
,鎖可能位於散列映射存儲桶級別。較低級別鎖定的效果是,您可以使同步讀取器和寫入器不可能用於同步集合。這導致更多的可擴展性。
ConcurrentHashMap
不會拋出ConcurrentModificationException
如果一個線程試圖修改它,而另一個線程迭代它。
這篇文章Java 7: HashMap vs ConcurrentHashMap是一個很好的閱讀。強烈推薦。在SynchronizedMap
簡短的回答:
兩個地圖是Map
接口的線程安全的實現。在期望高併發性的情況下實現更高吞吐量的ConcurrentHashMap
。
Brian Goetz的article關於背後的想法ConcurrentHashMap
是一個非常好的閱讀。強烈推薦。
這是什麼? HashMap的:請注意,此實現不是同步的 ,以防止意外的非同步訪問地圖: '地圖M = Collections.synchronizedMap(新的HashMap(...));' 的http://文檔。 oracle.com/javase/7/docs/api/java/util/HashMap.html – karate 2014-10-21 16:23:09
「Brian Goetz的文章......是一篇很好的文章。」 - 他的「Java併發實踐」一書更是如此。 – 2015-07-28 14:41:37
ConcurrentHashMap
是線程安全的,沒有同步整個地圖。讀取可以非常快速地進行,而寫入是通過鎖定完成的。
ConcurrentHashMap
使用稱爲lock stripping
的細粒度鎖定機制允許更大程度的共享訪問。由於這個原因,它提供了更好的併發性和可擴展性。
而且迭代器返回ConcurrentHashMap
是弱一致,而不是失敗的同步HashMap的使用快速的技術。
方法持有對象的鎖,而在ConcurrentHashMap
有其中持有鎖上的內容,而不是桶「鎖條帶化」的概念。從而提高了可擴展性和性能。
的ConcurrentHashMap:
1)兩個地圖是Map接口的線程安全的實現。
2)ConcurrentHashMap在預計高併發的情況下實現更高的吞吐量。
3)對象級別沒有鎖定。
同步散列映射:
1)每種方法使用對象級鎖同步。
兩者都是HashMap的同步版本,它們的核心功能和內部結構有所不同。
ConcurrentHashMap由內部分段組成,可以從概念上看作獨立的HashMap。 所有這些段可以由高併發執行中的單獨線程鎖定。 因此,多線程可以從ConcurrentHashMap獲取/放置鍵/值對,而不會相互阻塞/等待。 這是實現更高的吞吐量。
而
Collections.synchronizedMap(),我們得到的HashMap的同步版本,它是在封閉的方式進行訪問。這意味着如果多個線程同時嘗試訪問synchronizedMap,它們將被允許以同步的方式一次一個地獲取/放置鍵值對。
我們可以通過使用ConcurrentHashMap和synchronisedHashmap來實現線程安全。但是,如果你看看他們的架構,就會有很多不同。
- synchronisedHashmap
將維持在對象級別的鎖。所以如果你想執行任何操作,比如put/get,那麼你必須先獲得鎖。同時,其他線程不允許執行任何操作。因此,一次只有一個線程可以對此進行操作。所以等待時間會在這裏增加。當你比較ConcurrentHashMap時,我們可以說性能相對較低。
- 的ConcurrentHashMap
它將保持在片段級別的鎖。它有16個段,默認情況下併發級別保持爲16。因此,一次有16個線程可以在ConcurrentHashMap上運行。而且,讀取操作不需要鎖定。所以任何數量的線程都可以對它執行get操作。
如果thread1想要在段2中執行put操作並且thread2想要在段4上執行put操作,那麼它在這裏是允許的。意思是說,16個線程一次可以對ConcurrentHashMap執行更新(放入/刪除)操作。
這樣等待時間就會少一些。因此,性能比同步的Hashmap要好。
的ConcurrentHashMap允許數據的並行訪問。整個地圖被分成幾部分。
閱讀操作ie。即使在細分層面,get(Object key)
也不同步。
但寫入操作即。 remove(Object key), get(Object key)
在段級別獲取鎖定。只有整個映射的一部分被鎖定,其他線程仍然可以讀取除鎖定之外的各個段的值。
SynchronizedMap另一方面,在對象級別獲取鎖定。所有線程都應該等待當前線程,而不管操作如何(讀/寫)。
那麼'Hashtable'和'Synchronized HashMap'有什麼區別? – roottraveller 2017-07-11 06:47:48
在ConcurrentHashMap和Synchronized HashMap之間,你推薦哪一個? – Blunderchips 2017-11-25 14:16:55