假设我的应用程序只有一个线程,并且运行该应用程序的平台有多个 CPU。有可能应用程序的单线程在某个时间点在 cpu A 上执行,读取属性 X 的值,修改其值,并且属性 X 的修改值不会提交到主内存,它只是驻留在 cpu 注册表中或缓存。然后,一段时间后,应用程序的同一线程可以在 cpu B 上继续其流程,读取属性 X 的值并从主内存中获取过时的值,因为更新的值驻留在 cpu A 注册表/缓存上。
所以到目前为止,我到处都看到这种可见性问题只发生在多线程应用程序中,但似乎如果我已经描述过,这也是可能的。
有什么想法吗?
最佳答案
Java 语言定义表示,线程中较早发生的任何事情与同一线程中较晚发生的任何事情之间存在“先发生”关系。这意味着 JVM 负责与操作系统一起工作,以确保线程中较早写入的任何数据对于同一线程中较晚的任何操作的可见性。在大多数操作系统上,我相信这将在操作系统级别进行处理,方法是在线程切换时保存寄存器状态并将缓存刷新到内存。无论如何,您在编写Java代码时不必担心它。
关于Java单线程执行和cpu缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43682114/