Java 这个多线程代码中不需要volatile关键字吗?
我在以下方面遇到了这个例子: 我不明白的是,为什么在声明布尔值“hasDataToProcess”时不使用volatile关键字。在线程A将其设置为true的情况下,它可能只反映在其本地缓存中,而不反映在主存中,因此如果从主存或其单独的本地缓存读取,线程B可能永远不会看到它设置为true 在本教程的前一章中,作者解释了声明变量volatile的重要性,但随后他给出了一个不符合早期指南的示例,因此我对volatile的用法有点困惑 请帮助理解何时使用或不使用volatile,以及这段代码中是否需要volatile?若有,原因为何?如果没有,为什么不呢?没有。Java 这个多线程代码中不需要volatile关键字吗?,java,multithreading,volatile,Java,Multithreading,Volatile,我在以下方面遇到了这个例子: 我不明白的是,为什么在声明布尔值“hasDataToProcess”时不使用volatile关键字。在线程A将其设置为true的情况下,它可能只反映在其本地缓存中,而不反映在主存中,因此如果从主存或其单独的本地缓存读取,线程B可能永远不会看到它设置为true 在本教程的前一章中,作者解释了声明变量volatile的重要性,但随后他给出了一个不符合早期指南的示例,因此我对volatile的用法有点困惑 请帮助理解何时使用或不使用volatile,以及这段代码中是否需要
对
hasDataToProcess
的所有访问都在同一锁上的块已同步
内<代码>易失性不是必需的。如何使用同步解决此问题?据我所知,volatile确保所有读写操作都发生在主内存中。因此,在上述情况下(不使用volatile),如果线程A将其设置为“true”,则它可能只发生在线程A的本地缓存中。现在,当线程B读取它时,它从主内存中读取它,导致读取“false”,这是意外的。请你在这些方面再解释一下好吗。Synchronized仅确保一次只有一个线程进入同步方法。对吗?@abhishek08aug-错synchronized
导致线程在进入块时适当刷新其缓存。谢谢!热舔!这是怀疑的根本原因@阿披实8月8日这是一个常见的神话。volatile
关键字与主内存中是否发生读取或写入无关。现代硬件就是不能这样工作。volatile
关键字确保其他线程可以立即看到读写操作。这与主内存无关,在现代CPU上,完全是在缓存中完成的。你说的是什么“本地缓存”?
public class MySignal{
protected boolean hasDataToProcess = false;
public synchronized boolean hasDataToProcess(){
return this.hasDataToProcess;
}
public synchronized void setHasDataToProcess(boolean hasData){
this.hasDataToProcess = hasData;
}
}