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

时间:2015-02-20 17:27:53

标签: java c# c++ multithreading memory

我只是想到了这个问题而无法找到答案

如果我将一个静态的非原始变量(比如说X)传递给一个稍后开始的线程(所以假设该线程持有对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 ++,Java,C#等主流语言是否有可能发生? (所有版本的jvm for java和所有版本的.Net和Mono for C#)?

我不希望这种情况发生,但是如果它会出现在任何类型的流行平台上,可能会引起疯狂的编译器优化,缓存(总是有可能),非常便宜的硬件等等

2 个答案:

答案 0 :(得分:2)

我觉得你有点困惑。程序不会将内存中的数据读入...其他内容(严重的是,您认为它会去哪里?)。它的始终从内存中读取。

每次都是这样。所以不,你的情况根本不可能。它将始终具有更新的值。

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

答案 1 :(得分:0)

它不是关于对象(具体完全构建)而是关于对象的状态。所以,让我们说如果你在X中构成了一个由State组成的计数器,是的,如果线程a写入计数器,则可能发生线程B无法看到这些变化。