[英]Are objects stored in thread safe collection thread safe?
存儲在線程安全集合(如CopyOnWriteArrayList)中的對象是否安全? 讓我們說存儲的對象是可變的(不是線程安全的),那么集合(在這里,CopyOnWriteArrayList)是線程安全的事實為存儲在其中的引用的線程安全提供了保證嗎?
不,對象不是線程安全的; 如果兩個線程更改了從CopyOnWriteArrayList檢索的可變對象,則將導致數據爭用。
如果集合是線程安全的,則意味着兩個線程可以在不破壞集合的情況下從集合中添加/刪除對象(例如,ArrayList不是線程安全的,因此,如果兩個線程各自嘗試將對象添加到集合中,則一個或兩個對象可能會丟失),但是仍然需要同步集合中的對象以使它們成為線程安全的。
有一些保證,就內存效果而言,通常線程安全存儲類似於易失性變量。
volatile Foo var; final Vector<Foo> vars = new Vector<>()
// thread 1 // thread 1
foo.bar = bar; [1] foo.bar = bar; [1]
var = foo; vars.set(0, foo);
// thread 2 // thread 2
bar = foo.bar; [2] bar = vars.get(0).bar; [2]
//read[2] sees write[1] // read[2] sees write[1]
基本上,插入之前的寫入對於檢索之后的讀取應該是可見的。
提供的唯一線程安全保證是對象將被“安全發布”。 也就是說,它們將立即對所有線程可見(這包括對對象及其內部狀態的引用)。
示例:如果線程A寫入X,而線程B讀取,則B保證看到X像A一樣離開了X。 換句話說,讀和寫操作與其發生的順序一致。
還有其他方法可以完成同一件事,例如使用final
或volatile
或AtomicReference
或鎖(線程安全集合正在執行的操作)或靜態初始化器。 有關詳細信息,請參見《實踐中的Java並發》一書。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.