java - 通过访问器检索的实例成员的线程安全

标签 java concurrency

A的方法由两个线程访问。一个线程更新它。另一个检索其成员。

public class A {
    private V v;

    public V getV() {
        return v;
    }

    public V updateV(A a, B b, Cc) {
        //complex logic updating V
    }
}

如何使 V 线程安全?

最佳答案

使V线程安全的最简单方法是使其不可变(通过将其所有非静态字段设为final),然后在A中您只需在 updateV 中影响 V 的新实例,如下所示:

public class A {
    private V v;

    public synchronized V getV() {
        return v;
    }

    public synchronized V updateV(A a, B b, Cc) {
        //complex logic updating V
        this.v = new V(...);
        return v;
    }
}

正如您所看到的,为了使 A 线程安全,我只是将关键字 synchronized 添加到 getter 和 setter,以防止并发读写,但如果不需要的话在你的情况下,你仍然可以使 v volatile 如下:

public class A {
    private volatile V v;

    public V getV() {
        return v;
    }

    public V updateV(A a, B b, Cc) {
        //complex logic updating V
        this.v = new V(...);
        return v;
    }
}

关于java - 通过访问器检索的实例成员的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38737592/

相关文章:

java - 内存屏障和 java.util.concurrent.locks.Condition 示例

java - 用 Executor 替换 BlockingQueue + 守护线程

java - Mongo Jackson Mapper 按 id 结果删除

java - 测试类静态初始化程序的最佳方法是什么?

java - Jaxb:如何解码 xs:任何 XML 字符串部分?

java - 使用 Java 在防火墙中打开端口?

Java ReentrantReadWriteLock - 正确用法?

java - 在 NetBeans Platform 中,启动代码应该放在哪里

java - 获取 Java 中预定的非阻塞操作的结果

java - 在递归 block 内使用 CountDownLatch 和 Object.wait 挂起