Java中的惰性布尔关闭标志是否需要volatile?

use*_*001 0 java concurrency multithreading

假设以下代码

public class Singleton {

  boolean shuttingDown = false;


  void action() {
    if (shuttingDown) {
      throw new RuntimeException("already shutting down");
    } 
    // do some more stuff
  }

  // Called by a single thread only
  void onShutDown() {
    shuttingDown = true;
    // perform some more actions to remedy the class
  }
}
Run Code Online (Sandbox Code Playgroud)

基本上我想阻止所有即将到来的调用action().我知道设置shuttingDown是原子操作.但是问题是我是否需要使用shuttingDownvolatile来使更改对其他线程可见,这些线程可能会从线程池中重用.

我看到了这个oracle教程以及AtomicBoolean上的javadoc .然而,后者也使用挥发性.我在单个线程中只设置了一次值,所以我不需要AtomicBoolean提供的锁定机制.我只想在变量更新后立即对所有线程进行更改.

据我所知的oracle教程,更新操作是原子的,在设置值时没有其他线程可以接受.问题是,何时将更新的值填充到其他线程(如果有的话?).

hen*_*nry 6

简短的回答是肯定的,你必须让它变得不稳定.

虽然操作是原子操作,但为了保证其他线程可见,您需要在关系之前建立一个事件.易失性是最简单的方法.

  • @ user3001,Whatever提供与`volatile`相同的可见性保证将与`volatile`具有相同的性能损失. (2认同)