Java 是否有必要使此变量不稳定?
我正在经历一场“JAX伦敦2011”。在43:20到43:40之间,一位观众说下面代码中的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
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。