Java 是否有必要使此变量不稳定?

Java 是否有必要使此变量不稳定?,java,multithreading,volatile,Java,Multithreading,Volatile,我正在经历一场“JAX伦敦2011”。在43:20到43:40之间,一位观众说下面代码中的shutdown变量应该被声明为volatile,演讲者同意这一点(并且说前面也指出了这一点,但他们只是没有修改演示文稿)。有关守则是: public abstract class QueueReaderTask implements Runnable { private boolean shutdown = false; protected BlockingQueue<WorkUnit&l

我正在经历一场“JAX伦敦2011”。在43:20到43:40之间,一位观众说下面代码中的
shutdown
变量应该被声明为
volatile
,演讲者同意这一点(并且说前面也指出了这一点,但他们只是没有修改演示文稿)。有关守则是:

public abstract class QueueReaderTask implements Runnable {

  private boolean shutdown = false;
  protected BlockingQueue<WorkUnit<String>> lbq;

  public void run() {
    while (!shutdown) {
      try {
        WorkUnit<String> wu = lbq.poll(10, TimeUnit.MILLISECONDS);
        if (wu != null) { doAction(wu.getWork()); }
      } catch (InterruptedException e) {
        shutdown = true;
      }
    }
  }

  public abstract void doAction(String msg);
  public void setQueue(BlockingQueue<WorkUnit<String>> q) { lbq = q; }
}
每个任务/线程都有该变量的一个不同的私有副本。那么,为什么要让它“不稳定”

如果仅从
QueueReaderTask
实例中修改
shutdown
布尔值,则您是正确的。在这种情况下,
shutdown
仅由一个线程修改,不需要是
易失性的

坦白地说,代码对我来说很奇怪。为什么要捕获中断异常,设置关闭布尔值,然后循环并退出。为什么现在只做下面的事情?为什么有
关闭
标志

while (true) {
  try {
    WorkUnit<String> wu = lbq.poll(10, TimeUnit.MILLISECONDS);
    if (wu != null) { doAction(wu.getWork()); }
  } catch (InterruptedException e) {
     Thread.currentThread().interrupt();
     return;
  }
}
while(true){
试一试{
WorkUnit wu=lbq.poll(10,TimeUnit.ms);
if(wu!=null){doAction(wu.getWork());}
}捕捉(中断异常e){
Thread.currentThread().interrupt();
返回;
}
}
可能在帖子中删除了额外的代码?如果不是,我想知道这是否是从一个更大的代码部分复制和粘贴的,其中
shutdown
在方法调用中也被设置为true

注意:-我可以理解,如果一个变量(可能)被多个线程共享,那么它应该被声明为“volatile”,就像在双重检查锁定模式中一样:

class Foo {
        private volatile Helper helper = null;
        public Helper getHelper() {
            if (helper == null) {
                synchronized(this) {
                    if (helper == null)
                        helper = new Helper();
                }
            }
            return helper;
        }
}

对。典型的模式是从另一个告诉线程停止处理的线程修改
shutdown
。在这种情况下,它必须是易变的

有人想解释-1吗?谢谢。我认为可以安全地假设只能从QueueReaderTask实例中修改“shutdown”,因为:a。“shutdown”变量被声明为私有。B该类没有“…”(意思是没有解释或遗漏代码)。C没有设置关机()。D变量的含义似乎是:“如果无法正确完成队列中对象的处理,请关闭自己”。如果另一个线程不能正确处理队列中的对象,那么它不应该关闭我。我同意@VenkateshDhandapani。