Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这个多线程代码中不需要volatile关键字吗?_Java_Multithreading_Volatile - Fatal编程技术网

Java 这个多线程代码中不需要volatile关键字吗?

Java 这个多线程代码中不需要volatile关键字吗?,java,multithreading,volatile,Java,Multithreading,Volatile,我在以下方面遇到了这个例子: 我不明白的是,为什么在声明布尔值“hasDataToProcess”时不使用volatile关键字。在线程A将其设置为true的情况下,它可能只反映在其本地缓存中,而不反映在主存中,因此如果从主存或其单独的本地缓存读取,线程B可能永远不会看到它设置为true 在本教程的前一章中,作者解释了声明变量volatile的重要性,但随后他给出了一个不符合早期指南的示例,因此我对volatile的用法有点困惑 请帮助理解何时使用或不使用volatile,以及这段代码中是否需要

我在以下方面遇到了这个例子:

我不明白的是,为什么在声明布尔值“hasDataToProcess”时不使用volatile关键字。在线程A将其设置为true的情况下,它可能只反映在其本地缓存中,而不反映在主存中,因此如果从主存或其单独的本地缓存读取,线程B可能永远不会看到它设置为true

在本教程的前一章中,作者解释了声明变量volatile的重要性,但随后他给出了一个不符合早期指南的示例,因此我对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;  
  }

}