[英]What's the risk if I replace AtomicBoolean with volatile in this code?
我正在阅读 JCP 7.2.4,它具有以下代码:
boolean checkMail(Set<String> hosts, long timeout, TimeUnit unit)
throws InterruptedException
{
ExecutorService exec = Executors.newCachedThreadPool();
final AtomicBoolean hasNewMail = new AtomicBoolean(false); // can we use volatile here?
try{
for(final String host : hosts){
exec.execute(new Runnable() {
public void run(){
if(checkMain(host)){
hasNewMail.set(true);
}
}
});
}
}finally{
exec.shutdown();
exec.awaitTermination(timeout, unit);
}
return hasNewMail.get();
}
这本书说:应该使用原子的,而不是易失的,因为内部的Runnable
可以访问hasNewMail
。
有邮件时布尔值设置为true,不考虑其前一个值是true还是false,不管其他线程是否在设置它的值。
我的疑问是,如果我用 volatile 替换这个 AtomicBoolean,潜在的风险是什么? 任何工作线程都可以将其设置为 true(当找到邮件时),那么我是否有可能无法获得正确的值?
明显不是; 在 lambda 或内部类中使用的局部变量必须是有效的 final 。 AtomicBoolean
有效,因为您的变量是对对象的引用 - 并且不会改变。
也许在询问之前先尝试一下:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.