我在http://tutorials.jenkov.com/java-concurrency/thread-signaling.html上看到了这个例子:
public class MySignal{
protected boolean hasDataToProcess = false;
public synchronized boolean hasDataToProcess(){
return this.hasDataToProcess;
}
public synchronized void setHasDataToProcess(boolean hasData){
this.hasDataToProcess = hasData;
}
}
我不明白为什么在声明boolean" hasDataToProcess"时没有使用volatile关键字。如果线程A将其设置为true,它可能只会反映在其本地缓存中,而不会反映在主内存中,因此如果从主内存或其单独的本地缓存读取,线程B可能永远不会将其设置为true? / p>
在本教程的前一章中,作者解释了声明变量volatile的重要性,但他提出了一个不符合早期指南的例子,所以我对volatile的使用有点困惑。
请帮助理解何时使用或不使用volatile以及这段代码是否需要?如果是,为什么?如果没有,为什么不呢?
答案 0 :(得分:2)
hasDataToProcess
的所有访问都在同一个锁上的synchronized
块内。 <{1}}不是必需的。