Java单线执行和CPU缓存



假设我的应用程序只有一个线程,并且应用程序运行的平台具有多个CPU。在某个时间点执行应用程序的单个线程可能会在CPU a上执行,读取属性X的值,修改其值,并且属性X的修改值不投入主要内存,它只是位于CPU注册表或缓存。然后,一段时间后,相同的应用程序线程可以继续在CPU B上继续其流程,读取属性X的值并从主内存中获取陈旧值,因为更新的值位于CPU A注册表/CACHE上。

所以到目前为止,我到处都看到了这种可见性问题仅在多线程应用程序中发生,但是如果我已经描述了这也是可能的。

有什么想法吗?

Java语言定义说"发生在线程中发生的任何事物与在同一线程中发生后期发生的事物之间发生的事物之间存在"。这意味着与操作系统一起工作是JVM的责任,以确保在线程以后在同一线程中的任何操作中编写的任何数据的可见性。在大多数操作系统上,我相信这将在操作系统级别上处理,通过将寄存器状态和将线程切换出来时将缓存保存到内存中。无论如何,您在编写Java代码时不必担心它。

最新更新