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