类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
线程安全?
答案 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;
}
}