簡體   English   中英

從多個線程訪問Hashmap而不進行同步

[英]Accessing Hashmap from multiple threads without synchronization

我有一個HashMap,我需要多個線程才能訪問。 我的設計是這樣的,每個線程將在地圖中讀取和寫入自己的條目:相同的地圖,但沒有兩個線程在同一條目上工作。 沒有一個線程需要迭代地圖或調用size() 所以我的問題是:我是否必須在Hashmap上進行同步,或者我可以放心地使用它,它永遠不會拋出ConcurrentModificationException? 我顯而易見的擔心是同步會造成巨大的瓶頸。

所以我的問題是:我是否必須在Hashmap上進行同步,或者我可以放心地使用它,它永遠不會拋出ConcurrentModificationException?

您應該使用ConcurrentHashMap來實現此目的。 問題不僅在於迭代,還在於內存同步。

...每個線程都將在地圖中讀取和寫入自己的條目...

這是一個含糊不清的人。 如果您的HashMap是靜態的,因為線程只是從地圖讀取並且只對地圖中引用的對象進行更改但是沒有更改地圖中的值,那么您就可以了。 您可以在線程啟動之前初始化地圖並且可以在沒有內存同步的情況下使用地圖。

但是,如果一個線程以任何方式更改映射以指向新對象,則它必須將該更改發布到中央內存,其他線程必須查看這些更新。 這需要在讀取和寫入兩側進行存儲器同步。

我顯而易見的擔心是同步會造成巨大的瓶頸。

這有點過早優化。 在對地圖進行爭用之前,很可能您會被IO限制。 在任何情況下,切換到使用ConcurrentHashMap都可以減輕您的后顧之憂,與非同步映射相比,性能降低最小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM