在实例变量布尔线程上进行同步写入的类是否安全?例如:
boolean foo = true;
public synchronized void setFoo(boolean foo) {
this.foo = foo;
}
public boolean getFoo() {
return foo;
}
如果你的程序只需要保证同步写入,不关心读取的一致性,那么当前的实现可以认为是线程安全的。
如果还需要一致读取,您有两种选择:
getFoo
方法:这可以确保读取和写入都是互斥的,保证一个线程始终读取另一个线程写入的最新值。
使用 volatile
关键字:将 foo
声明为 volatile
可确保对 foo
的更改对所有线程立即可见。然而,与同步相比,volatile
提供的保证较弱。它不会阻止编译器对指令重新排序,这可能会导致复杂场景中的微妙问题。