簡體   English   中英

如何獲取ConcurrentHashMap的最新視圖?

[英]How do I get the latest view of a ConcurrentHashMap?

您可以通過使變量可變或通過使兩個線程在某事物上同步來確保一個線程對變量的更改可以在其他線程上看到。 如果要更改的是java.util.ConcurrentHashMap,則通過將保存此映射的變量的類型聲明為volatile來創建內存屏障是否有意義,或者讀者正在訪問該映射(例如,通過myMap.values() )反正要獲得最新的可能視圖? 對於上下文,我的閱讀量很輕,寫作很輕松,正在將無鎖閱讀解決方案切換到ConcurrentHashMap。

ConcurrentHashMap保證寫入和后續讀取之間存在事前發生的關系。 因此,是的,當您閱讀(獲取)時,您將看到“已提交”(已返回放置)的最新更改。

注意:這不適用於javadoc中解釋的迭代器。

變量“持有”地圖是對地圖對象(分別(簡化)到存儲地圖的內存地址)的引用或指針。 使它易失性只會影響指針,而不會影響地圖對象本身。 只要您始終使用相同的Map-Object並確保在線程使用它之前就對它進行了完全初始化,則不必使用“易失性引用”。 並發在並發哈希映射內部透明地處理。

是的, ConcurrentHashMap提供了最新視圖。 如果您在http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ConcurrentHashMap.html#get(java.lang.Object)上引用了Javadocs,則會清楚地指出:

檢索反映了剛發生時最新完成的更新操作的結果

它有更多詳細信息,我建議您去閱讀。

此外,如前所述,使用volatile不是您想要的,因為它只會影響指針,而不會影響映射的實際內容。

您需要做的就是確保保存地圖的參考是最終的,因此您將獲得最終的字段圍欄,以確保您看到正確初始化的地圖,並且參考本身不會更改。

正如其他人指出的那樣, ConcurrentHashMap將確保內部可見性/發生在寫入之前,就像所有java.util.concurrent.*集合所做的那樣。 但是,您應該使用ConcurrentMap接口上公開的條件寫入,以避免寫入中發生數據爭用。

暫無
暫無

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

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