簡體   English   中英

Java並發集合和可見性

[英]Java Concurrent Collections and visiblity

對於並發集合(例如ConcurrentMap)在集合中數據的可見性方面,我有些不確定。

答:Thread1放置了一個復雜的對象,而Thread2獲取了它。 所有屬性在Thread2中都可見嗎?

B:Thread1放置了一個復雜的對象,后來又更改了一些屬性。 然后Thread2得到它,所有更改都將在Thread2中可見嗎?

我猜B是錯誤的,如果是這樣,我應該同步對復雜對象的每次訪問嗎?

推送到並發集合被定義為發布它。 請參閱程序包說明中的“ 內存一致性屬性 ”。

這意味着,如果只更改存儲的對象,則不會自動發生關系發生。 您將需要使這些更改同步/易變或使用並發原語本身。

答:如果對象是不可變的,或者對象是可變的,但是將對象添加到集合之前設置了所有屬性,那么可以,它們都是可見的。 B:如果沒有適當的同步機制,則不能保證,這取決於線程2訪問對象的時間。

如果您需要保證這種行為(即保證閱讀線程能夠以類似事務的方式查看mutator線程所做的所有修改),建議您建立一種信號量機制。 更好的是,如果您使用不可變的對象,它將更加簡單。

暫無
暫無

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

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