类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/