gpt4 book ai didi

java - 有必要让这个变量变易变吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:50:38 25 4
gpt4 key购买 nike

我正在经历“JAX London 2011”presentation on "Modern Java Concurrency" .在持续时间 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; }
}

我的问题:我认为 shutdown 不应该声明为 volatile。我的理由是 shutdownRunnable 的成员,每个任务/线程都将拥有该变量的独特私有(private)副本。那么,为什么要让它volatile呢?

但由于这是在 JAX 2011 中讨论的,我假设观众中有很多专家级 Java 开发人员。我不认为他们所有人都会错过这个!那么,我错过了什么?

附言:-我可以理解,如果一个变量(可能)被多个线程共享,那么它应该被声明为 volatile,就像在 Double-Checked-Locking 模式中一样:

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

最佳答案

each task/thread will have a distinct private copy of that variable. So, why make it 'volatile' ?

如果 shutdown boolean 值仅从 QueueReaderTask 实例中修改,您是正确的。在那种情况下,shutdown 仅由一个线程修改,不需要 volatile

坦率地说,代码对我来说看起来很奇怪。为什么要捕获InterruptedException,设置shutdown boolean 值,然后循环退出。为什么现在只执行以下操作?为什么要有 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;
}
}

也许帖子中删除了额外的代码?如果不是,我想知道这是否是从较大的代码部分复制和粘贴的,其中 shutdown 在方法调用中 设置为 true。

P.S:- I can understand that a variable should be declared 'volatile' if it was (potentially) shared by multiple threads, as in the Double-Checked-Locking pattern :

没错。一个典型的模式是 shutdown 是从另一个告诉线程停止处理的线程修改的。在这种情况下,它需要是 volatile

关于java - 有必要让这个变量变易变吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15648683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com