【发布时间】:2018-06-17 00:11:45
【问题描述】:
这是 Brian Goetz 的 Java Concurrency in Practice 中清单 7.20 中的代码:
public class CheckForMail {
public boolean checkMail(Set<String> hosts, long timeout, TimeUnit unit)
throws InterruptedException {
ExecutorService exec = Executors.newCachedThreadPool();
final AtomicBoolean hasNewMail = new AtomicBoolean(false);
try {
for (final String host : hosts)
exec.execute(new Runnable() {
public void run() {
if (checkMail(host)) hasNewMail.set(true);
}
});
} finally {
exec.shutdown();
exec.awaitTermination(timeout, unit);
}
return hasNewMail.get();
}
private boolean checkMail(String host) { // Check for mail return
false;
}
}
提到这段代码,Goetz 说“使用 AtomicBoolean 而不是 volatile 布尔值的原因是,为了从内部 Runnable 访问 hasMail 标志,它必须是最终的,这将排除修改它”(第 158 页)。
为什么它必须是最终的?你不能把它变成一个非最终的布尔变量吗?
【问题讨论】:
-
问:那么“Goetz”是谁,你引用的这些数字是什么????无论如何:这是一篇很好的文章,描述了“a) Java
volatile是什么,你为什么需要它?b) “final与volatile有什么关系? javax0.wordpress.com/2016/09/21/final-volatile -
Goetz 是一本非常棒的书籍 Java 并发实践的作者
标签: java multithreading concurrency final atomicboolean