Java 单核jvm并发:是否可以进行不可见更新?

Java 单核jvm并发:是否可以进行不可见更新?,java,concurrency,jvm,java-memory-model,Java,Concurrency,Jvm,Java Memory Model,如果您有多个核心,并且两个线程共享一个非易失性字段(第一个线程仅从该字段读取,第二个线程进行一些写入),则可能会出现这样的情况:第一个线程在第二个线程更新该字段后看不到该字段的实际值,因为该新值可以存储在另一个核心的缓存中 单核环境也是如此吗?不同的缓存是导致这种不一致的唯一原因吗?(我现在不考虑竞争条件和其他并发问题)? < P>编译器可以得出结论,变量不能在某个块内改变,并优化额外的负载,从而防止它们被观察到,即使在单个核心环境中。 我想知道你为什么要问。您应该根据语言/java内存模型的保

如果您有多个核心,并且两个线程共享一个非易失性字段(第一个线程仅从该字段读取,第二个线程进行一些写入),则可能会出现这样的情况:第一个线程在第二个线程更新该字段后看不到该字段的实际值,因为该新值可以存储在另一个核心的缓存中


单核环境也是如此吗?不同的缓存是导致这种不一致的唯一原因吗?(我现在不考虑竞争条件和其他并发问题)?

< P>编译器可以得出结论,变量不能在某个块内改变,并优化额外的负载,从而防止它们被观察到,即使在单个核心环境中。
我想知道你为什么要问。您应该根据语言/java内存模型的保证进行编程,而不是某些特定于平台/实现的行为。

这只是为了更好地理解正在发生的事情,而不是为了practice@ka4eli这个好答案的一个例子是。想象一个简单的:
while(!stop){…}
在读卡器线程中,
stop
是共享变量。允许编译器将其重写为
boolean temp=stop;而(!temp){…}
(称为变量提升)。如果发生这种情况,您的阅读器线程显然将永远看不到更新的值,因为它甚至不会尝试读取它。。。如果
stop
不稳定,则不允许进行优化。