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

时间:2016-08-03 07:53:42

标签: 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线程安全?

1 个答案:

答案 0 :(得分:2)

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

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;
    }
}