Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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 线程是否会使用传入的旧值?_Java_C#_C++_Multithreading_Memory - Fatal编程技术网

Java 线程是否会使用传入的旧值?

Java 线程是否会使用传入的旧值?,java,c#,c++,multithreading,memory,Java,C#,C++,Multithreading,Memory,我只是想到这个问题,找不到答案 如果我将一个静态非原语变量(比如X)传递给一个稍后启动的线程(因此假设该线程持有对X的引用),那么当线程启动时,它是否有可能使用旧的X值,而不是从内存中读取X 或者类似的场景,如: thread A runs and writes X = a to RAM, then gets blocked by IO thread B reads X = a from RAM, queues a unit of work to A, which would use X t

我只是想到这个问题,找不到答案

如果我将一个静态非原语变量(比如X)传递给一个稍后启动的线程(因此假设该线程持有对X的引用),那么当线程启动时,它是否有可能使用旧的X值,而不是从内存中读取X

或者类似的场景,如:

thread A runs and writes X = a to RAM, then gets blocked by IO

thread B reads X = a from RAM, queues a unit of work to A, which would use X

thread A resumes and writes X = b to RAM, then it finishes what it had left

...

thread A resumes and runs that unit of work queued to it, which would use X

Is it possible that X would have the value a?
<>如果是,主流平台上的C语言、C++语言、爪哇语言、C语言等主流语言都有可能发生吗?(适用于java的jvm的所有版本以及适用于C#的.Net和Mono的所有版本)


我不认为会发生这种情况,但我很好奇,在任何流行的平台上是否会发生这种情况,可能会导致疯狂的编译器优化、缓存(总是有可能)、极其廉价的硬件等等。这与对象(具体的完全构建)无关,而与对象的状态有关。假设X中有一个计数器,它构成了状态的一部分,如果线程a写入计数器,那么可能会发生这样的情况:线程B看不到更改。

我认为您有点困惑。程序不会将数据从内存读入。。。还有别的(说真的,你认为它会去哪里?)。它总是从记忆中读出

一直,每次。所以不,你的方案根本不可能。它将始终具有更新的值


快速免责声明,变量/数据总是可以由CPU缓存以避免RAM命中,因此如果硬件不同步,这可能会发生,但这不是语言/运行时的问题。“内存”的软件概念包括RAM、缓存和虚拟内存。

是的,我认为这也不可能发生,但我仍然想知道是否有任何疯狂的编译器优化、缓存、极为廉价的硬件,而这些硬件的保证很弱,可能会导致这种无意义的情况。我很确定这在Java中确实会发生。我认为虚拟机缓存内存,除非你给它volatile关键字。但是,我仍然相信在这个场景中x等于b,但是如果它是静态的,那么在任何时候都不应该只有一个实例吗?你能像那样改变一个静态变量的值并让它做任何事情吗?没关系,我又读了一遍静态变量。我不经常用它们。除非线程创建类对象时该类中有x,否则它可能仍然等于“硬件做了一些可怕的错误”-CPU不需要同步缓存,除非明确告知-这不是“可怕的错误”行为,但是这是应该预料到的。@AlexeiLevenkov yeh他们都有volatile,但Java是唯一明确指定volatile将触发内存屏障的变量,因此变量总是以原子方式从内存中读取,C#接近,但不提供强保证(所以yeh.Net现在可以工作,因为它使用了一个强大的回忆录模型,但对于Mono或任何未来的版本,不能说同样的事情)