2015-10-06 71 views
5

难道emitting变量是volatile吗? emit()方法从不同的线程调用,并且发射必须可见。
但它仅在​​块中访问。 // ...是工作完成的地方,但emitting未在此处引用。是否需要volatile,以防止同步访问

因此,如果​​的结构已修复,那么对于emitting还是不需要volatile? (为什么?)

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; 
      } 
     } 
     // ... 
    } 

弗兰克

回答

5

如果从​​块只能访问不需要volatile关键字。

同步保证对同步块内访问的变量的更改对进入同步块的所有线程均可见。

从书Java并发在实践中

要发布对象安全,无论是参照 对象和对象的状态必须以相同的是可见的其他 线程时间。正确构造的对象可以通过以下方式安全地发布:

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

注:通过锁定把守输入在同步块装置

相关问题