2014-04-09 32 views
0

如果我使用CopyOnWriteArrayList共享線程之間的項目列表,我是否還需要同步項目(如果它們由不同線程更新和讀取)?我是否需要同步CopyOnWriteArrayList中的項目,如果它們由不同的線程更新和讀取?

目前我的商品類定義如下。我是否需要將同步添加到每個getter和setter?

基本上我想有一個線程,以確保更改是在另一個線程可見的 - 我想的CopyOnWriteArrayList會提供一個內存屏障,以確保這一點,但我想肯定 - 感謝

public class MyClass { 
    private String string; 
    private Long longObj; 
    private long longprim; 

    public String getString() { 
     return string; 
    } 

    public void setString(String string) { 
     this.string = string; 
    } 

    public Long getLongObj() { 
     return longObj; 
    } 

    public void setLongObj(Long longObj) { 
     this.longObj = longObj; 
    } 

    public long getLongprim() { 
     return longprim; 
    } 

    public void setLongprim(long longprim) { 
     this.longprim = longprim; 
    } 
} 
+0

'CopyOnWriteArrayList'的實例可能沒問題,但如果同時修改'MyClass'的實例則不會。 –

+0

你需要同步CopyOnWrite操作 – Mzf

+1

你在問什麼? 'CopyOnWriteArrayList'是線程安全的。你可以在多線程中使用它。如果'add'很常見 - 非常緩慢 - 在這種情況下,'ConcurrentLinkedQueue'快得多。 'MyClass'不是線程安全的,如果你用多線程對它們進行變異,那麼通常的可見性和原子性告誡應用,就像在多個線程之間共享單個實例一樣。 –

回答

0

由於您CopyOnWriteArrayList包含可變項目,您需要項目類別的完全同步。想象一下,兩個線程訪問列表中的同一項目(安全列表操作),然後操作此項目(不安全)。

相關問題