據我所知在HashMap
和ConcurrentHashMap
執行非選擇操作時,ConcurrentHashMap
會阻止整個Segments
(默認-16)?在非選擇操作的情況下HashMap和ConcurrentHashMap的主要區別?
回答
區別在於HashMap
不是線程安全的,這意味着如果你有多個線程使用它,你需要自己照顧併發操作。您可以使用Collections.synchronizedMap(map)
來創建一個包裝對象,其中所有方法都是(在該包裝對象上)並委託給包裝貼圖,從而可以很容易地使其線程安全。正如你可以看出這意味着糟糕的表現,因爲只有一個線程(讀寫器無關緊要)可以訪問它。
正如您所指出的那樣ConcurrentHashMap
是線程安全的,並嘗試處理與Collections.synchronizedMap()
有點不同的同步。通過將底層映射分區爲存儲桶並且每個存儲桶具有一個鎖,它將嘗試使用多個鎖來代替單個鎖。由於這些線程可以同時使用地圖而不會出現問題,因爲它們可能正在處理不同桶中的記錄。在這種情況下,您不需要鎖定整個地圖(所有存儲桶),而只需鎖定您感興趣的記錄所在的存儲桶,這意味着您可以同時對所有存儲桶執行並行操作。顯然,如果所有線程都在同一條記錄(或同一個存儲桶)上工作,它們仍會像Collections.synchronizedMap()
一樣同步,並且在寫入時會被阻塞。當讀者線程數量超過編寫器線程數時,這種方法非常好。
例如,你可能有(很簡單):
ConcurrentHashMap = [ bucket1 = [r1->x], bucket2 = [r2->y], bucket3 = [r3, z] ]
當你這樣做是爲了與主要R1條目的讀取/寫入操作的地圖會選擇bucket1作爲記錄應該有並鎖定bucket1並僅鎖定bucket1。然後,如果另一個線程如果查詢r2它可以安全地這樣做,但如果它查詢r1也必須等待bucket1被鎖定。
當然,所有這一切背後都有性能損失,但並不是很高(儘管我沒有任何基準來支持這一說法)。
這是否回答你的問題?
非常好的解釋。 – Chaitanya 2014-09-04 11:16:28
不,在非選擇(EX。put)操作的情況下,鎖定總是在段級別進行。
您可以看到ConcurrentHashMap源代碼。
每當你在併發hashmap上調用put()方法時,它首先計算特定段的哈希位置,然後只在該段上調用trylock()方法,而不是在表級別調用。
ConcurentHashMap的結構與簡單的HashMap不同。 初始化時,ConcurrentHashMap被分爲多個段(默認爲16)。
它允許相似數量的線程同時訪問這些段,以便每個線程在特定段上工作。
當一個線程在一個段上工作時,它會對其進行鎖定。它不會阻止其餘的細分市場。
如果您想了解更多關於它,我建議下面的鏈接 - 有明確的例子
- 1. HashMap和ConcurrentHashMap的INTERAL工作
- 2. 在我的情況下,Lock + HasMap或ConcurrentHashMap?
- 3. 選擇的情況下*當
- 4. 在這種情況下如何做多個選擇操作?
- 5. 的ConcurrentHashMap操作
- 6. java中的Array和Hashmap之間的主要區別是什麼?
- 7. #import和@class在我的簡單情況下的區別
- 8. 在Java字符串的情況下,與+ =和s1 + s2的區別
- 9. 在sqlalchemy的情況下選擇語句
- 10. IN和INNER JOIN在我的情況下有什麼區別?
- 11. 在這種情況下,char []和char *的區別是什麼?
- 12. 在手指畫的情況下,Path.quadTo和Path.lineTo有什麼區別?
- 13. 在這種情況下std :: move和std :: ref的區別
- 14. Hashtable和ConcurrentHashMap之間的區別
- 15. ConcurrentHashMap和哈希表的區別
- 16. jQuery的區分多個相同的選擇情況下
- 17. 在沒有頁面加載的情況下多次操作DOM中的選擇選項選擇值
- 18. 前往:在不阻止操作的情況下操作信號
- 19. 在沒有選擇的情況下,YUI 3中需要Javascript選擇框刷新?
- 20. 知情搜索與非知情搜索算法的主要區別是什麼?
- 21. Magento選擇類別無法在沒有index.php的情況下工作
- 22. while和between之間的區別是什麼,在我的情況下什麼是更好的選擇?
- 23. ConcurrentHashMap vs Synchronized HashMap
- 24. ConcurrentHashMap到HashMap
- 25. 選擇的情況下錯誤
- 26. 選擇的情況下,如果聲明?
- 27. 未選擇重構的情況下
- 28. SQL把選擇的情況下,
- 29. 默認情況下選擇的textfield-iphone
- 30. 在這種情況下哪個更好的ConcurrentHashMap或Synchronized Hash Map?
什麼是「非選擇操作」很好的解釋? – EJP 2014-09-04 09:40:02