emitting
变量是不是易变?从不同的线程调用emit()
方法,并且必须显示emit
但它只能在synchronized
块中访问。 // ...
是完成工作的地方,但此处未引用emitting
。
因此,如果synchronized
的结构已修复,我是否还需要volatile
emitting
? (为什么?)
static final class C {
boolean emitting = false; // shall be volatile ?
public void emit() {
synchronized (this) {
if (emitting) {
return;
}
// ...
emitting = true;
}
// ...
synchronized (this) {
if (!condition()) {
emitting = false;
return;
}
}
// ...
}
谢
答案 0 :(得分:7)
如果仅synchronized
块访问,则volatile
关键字不需要。{/ p>
同步保证对同步块内访问的变量的更改对于进入同步块的所有线程都是可见的。
从书中 Java并发实践:
要发布对象安全,两者都引用 对象和对象的状态必须对其他人可见 线程同时。正确构造的对象可以通过以下方式安全地发布:
- 从静态初始化程序初始化对象引用;
- 将对它的引用存储到易失性字段或原子参考中 ;
- 将对它的引用存储到正确构造的对象的最终字段中;
- 将对它的引用存储到正确被锁定的字段中。
注意: 由锁定意味着在同步块中输入