2015-06-27 46 views
1

如果您有多个内核和2个线程共享一个非易失性字段(第一个只读取它,第二个写入),则第二个线程更新后第一个线程看不到此字段的实际值时可能会出现这种情况,因为这个新值可以存储在另一个核心的缓存中。单核jvm并发性:隐形更新可能吗?

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

回答

3

编译器可能会得出结论,该变量不能在某个块内更改,并优化附加负载,从而防止它们被观察到,即使在单核环境中也是如此。

我想知道你为什么要问。您应该针对语言/ java内存模型的保证进行编程,而不是针对特定于平台/实现的行为。

+0

这只是为了更好地理解发生了什么,而不是练习 – ka4eli

+2

@ ka4eli这是一个很好的答案。设想一个简单的:while(!stop){...}'在读者线程中,其中'stop'是共享变量。编译器可以将其重写为'boolean temp = stop;而(!temp){...}'(它被称为变量提升)。如果发生这种情况,读者线程将显然永远不会看到更新的值,因为它甚至不会尝试读取它。如果“停止”是易失性的,则不允许优化。 – assylias