Volatile变量在这里有意义吗(多核处理器)?

时间:2014-11-05 12:13:07

标签: java volatile

我将实例变量声明为voltile。假设两个线程由多核下的两个处理器创建,其中线程更新变量。确保 瞬间可见性,我认为声明变量为volatile是正确的选择,这样线程完成的更新发生在主内存中,并且对另一个线程可见。 正确?

这里有意了解多核处理器的概念。

2 个答案:

答案 0 :(得分:1)

我假设您正在考虑使用volatile而不是使用任何特殊条款进行并发(例如synchronizedAtomicReference)。

无论您是运行单代码还是多核,都无关紧要:在没有volatile的情况下,线程之间的共享数据从不安全。没有它,运行时可以做更多的事情;基本上它可以假装访问线程是JVM上运行的唯一线程。线程可以读取一次值并将其永久存储在调用堆栈中;读取值但从不写入的循环可能会被转换,使得值在开始时只读取一次并且从不重新考虑,依此类推。

所以消息很简单:使用volatile - 但不一定所有你需要在并发代码中处理。

答案 1 :(得分:0)

它是否由不同的处理器完成并不重要。如果您没有多处理器,您仍然可能遇到并发问题,因为上下文切换可能随时发生。

如果一个字段不是volatile,它可能仍然在一个线程的缓存中,当它的上下文被切换出来而另一个线程的上下文被切换。在这种情况下,刚刚接管的线程(单个)处理器不会看到该字段已更改。

由于即使使用一个处理器也会发生这些事情,因此它们必然会发生在多个处理器上,因此您需要保护共享数据。

volatile是否是正确的选择取决于它的类型以及您要保护的更改类型。但同样,这与处理器的数量无关。

如果该字段是引用类型,则volatile仅确保该字段的新分配的可控性。它不会防止它指向的对象发生变化 - 因为你需要进行同步。