如果只是同步访问,则需要volatile

fbe*_*oit 6 java concurrency

应的emitting变量是volatile吗?emit()从不同的线程调用该方法,并且emit必须是可见的.
但它synchronized只能以块的形式访问.该// ...在哪里的工作就完成了,但地方emitting没有此处引用.

那么,如果结构synchronized是固定的,我是否还需要一个volatilefor 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;
            }
        }
        // ...
    }
Run Code Online (Sandbox Code Playgroud)

坦率

Dav*_*INO 7

如果仅从synchronized块访问它,则不需要volatile关键字.

同步保证对同步块内访问的变量的更改对于进入同步块的所有线程都是可见的.

Java并发实践中的书:

安全地发布对象,必须同时使对象的引用和对象的状态对其他线程可见.正确构造的对象可以通过以下方式安全发布:

  • 从静态初始化程序初始化对象引用;
  • 将对它的引用存储到易失性字段或原子参考中;
  • 将对它的引用存储到正确构造的对象的最终字段中;
  • 将对它的引用存储到由锁正确保护的字段中.

注意: 由锁定装置保护,在同步块中输入

  • @nits.kk 在不从同步块外部修改 Object2 状态之前,它是安全的。或者它是从与 Object1 不同的变量上的同步块修改的 (2认同)