我将实例变量声明为voltile。假设两个线程由多核下的两个处理器创建,其中线程更新变量。确保 瞬间可见性,我认为声明变量为volatile是正确的选择,这样线程完成的更新发生在主内存中,并且对另一个线程可见。 正确?
这里有意了解多核处理器的概念。
答案 0 :(得分:1)
我假设您正在考虑使用volatile
而不是使用任何特殊条款进行并发(例如synchronized
或AtomicReference
)。
无论您是运行单代码还是多核,都无关紧要:在没有volatile
的情况下,线程之间的共享数据从不安全。没有它,运行时可以做更多的事情;基本上它可以假装访问线程是JVM上运行的唯一线程。线程可以读取一次值并将其永久存储在调用堆栈中;读取值但从不写入的循环可能会被转换,使得值在开始时只读取一次并且从不重新考虑,依此类推。
所以消息很简单:使用volatile
- 但不一定所有你需要在并发代码中处理。
答案 1 :(得分:0)
它是否由不同的处理器完成并不重要。如果您没有多处理器,您仍然可能遇到并发问题,因为上下文切换可能随时发生。
如果一个字段不是volatile,它可能仍然在一个线程的缓存中,当它的上下文被切换出来而另一个线程的上下文被切换。在这种情况下,刚刚接管的线程(单个)处理器不会看到该字段已更改。
由于即使使用一个处理器也会发生这些事情,因此它们必然会发生在多个处理器上,因此您需要保护共享数据。
volatile
是否是正确的选择取决于它的类型以及您要保护的更改类型。但同样,这与处理器的数量无关。
如果该字段是引用类型,则volatile
仅确保该字段的新分配的可控性。它不会防止它指向的对象发生变化 - 因为你需要进行同步。