簡體   English   中英

存儲在線程安全的集合中的對象是否安全?

[英]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。 換句話說,讀和寫操作與其發生的順序一致。

還有其他方法可以完成同一件事,例如使用finalvolatileAtomicReference或鎖(線程安全集合正在執行的操作)或靜態初始化器。 有關詳細信息,請參見《實踐中的Java並發》一書。

暫無
暫無

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

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