Java 单线程执行和 cpu 缓存
Java single thread of execution and cpu cache
假设我的应用程序只有一个线程,应用程序运行的平台有多个 CPU。有可能应用程序的单线程在某个时间点在cpu A 上执行,读取属性 X 的值,修改它的值而属性 X 的修改值不是提交到主内存,它只驻留在 cpu 注册表或缓存中。然后一段时间后,应用程序的同一个线程可以继续其在 cpu B 上的流程,读取 属性 X 的值并从主内存中获取陈旧值,因为更新后的值驻留在 cpu一个registry/cache。
所以直到现在我到处都看到这种可见性问题只发生在多线程应用程序中,但似乎我已经描述过这也是可能的。
有什么想法吗?
Java 语言定义表明线程中较早发生的任何事情与同一线程中较晚发生的任何事情之间存在 "happens before" 关系。这意味着 JVM 有责任与操作系统一起工作,以确保线程中较早写入的任何数据对同一线程中稍后的任何操作的可见性。在大多数操作系统上,我相信这将在操作系统级别处理,方法是在线程关闭时保存寄存器状态并将缓存刷新到内存。无论如何,您在编写 Java 代码时不必担心。
假设我的应用程序只有一个线程,应用程序运行的平台有多个 CPU。有可能应用程序的单线程在某个时间点在cpu A 上执行,读取属性 X 的值,修改它的值而属性 X 的修改值不是提交到主内存,它只驻留在 cpu 注册表或缓存中。然后一段时间后,应用程序的同一个线程可以继续其在 cpu B 上的流程,读取 属性 X 的值并从主内存中获取陈旧值,因为更新后的值驻留在 cpu一个registry/cache。
所以直到现在我到处都看到这种可见性问题只发生在多线程应用程序中,但似乎我已经描述过这也是可能的。
有什么想法吗?
Java 语言定义表明线程中较早发生的任何事情与同一线程中较晚发生的任何事情之间存在 "happens before" 关系。这意味着 JVM 有责任与操作系统一起工作,以确保线程中较早写入的任何数据对同一线程中稍后的任何操作的可见性。在大多数操作系统上,我相信这将在操作系统级别处理,方法是在线程关闭时保存寄存器状态并将缓存刷新到内存。无论如何,您在编写 Java 代码时不必担心。