Java 如果CopyOnWriteArrayList中的项目由不同线程更新和读取,是否需要同步这些项目?

Java 如果CopyOnWriteArrayList中的项目由不同线程更新和读取,是否需要同步这些项目?,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,如果我使用CopyOnWriteArrayList在线程之间共享项目列表,那么如果项目由不同的线程更新和读取,我是否还需要同步这些项目 目前我的项目类定义如下。我是否需要向每个getter和setter添加synchronized 基本上,我想确保一个线程的更改在另一个线程中可见-我认为CopyOnWriteArrayList将提供一个内存屏障来确保这一点,但我想确保-谢谢 public class MyClass { private String string; private

如果我使用CopyOnWriteArrayList在线程之间共享项目列表,那么如果项目由不同的线程更新和读取,我是否还需要同步这些项目

目前我的项目类定义如下。我是否需要向每个getter和setter添加synchronized

基本上,我想确保一个线程的更改在另一个线程中可见-我认为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;
    }
}

因为CopyOnWriteArrayList包含可变项,所以需要对项类进行完全同步。想象一下,两个线程访问列表安全列表操作中的同一项,然后不安全地操作该项。

您的CopyOnWriteArrayList实例可能会很好,但如果同时修改MyClass实例,则不会。您只需要同步CopyOnWrite操作您在问什么?CopyOnWriteArrayList是线程安全的。您可以将其用于多个线程。如果add是公共的,则速度非常慢—在这种情况下,ConcurrentLinkedQueue要快得多。MyClass不是线程安全的,如果使用多个线程对其进行变异,则通常会应用可见性和原子性警告,就像在多个线程之间共享单个实例一样。