Caching Java中的可见性问题是由JVM还是硬件引起的?

Caching Java中的可见性问题是由JVM还是硬件引起的?,caching,jvm,visibility,volatile,Caching,Jvm,Visibility,Volatile,以前,我认为可见性问题是由CPU缓存性能引起的 但我看到这篇文章: 在第3段中。易变变量,它告诉线程持有缓存,听起来缓存是由JVM引起的 答案是什么?JVM还是硬件?JVM提供了一些弱保证。编译器和硬件会给您带来问题。:-) 当线程读取变量时,它不一定从内存中获取最新的值。处理器可能返回缓存的值。此外,即使程序员编写了第一次写入变量并随后读取的代码,只要不改变程序语义,编译器也可能对语句重新排序。处理器和编译器通常会这样做以优化性能。因此,线程可能看不到它期望看到的值。这可能导致并发程序中难以修

以前,我认为可见性问题是由CPU缓存性能引起的

但我看到这篇文章:

在第3段中。易变变量,它告诉线程持有缓存,听起来缓存是由JVM引起的


答案是什么?JVM还是硬件?

JVM提供了一些弱保证。编译器和硬件会给您带来问题。:-)

当线程读取变量时,它不一定从内存中获取最新的值。处理器可能返回缓存的值。此外,即使程序员编写了第一次写入变量并随后读取的代码,只要不改变程序语义,编译器也可能对语句重新排序。处理器和编译器通常会这样做以优化性能。因此,线程可能看不到它期望看到的值。这可能导致并发程序中难以修复的错误

大多数程序员都熟悉这样一个事实,即进入同步块意味着在监视器上获得一个锁,以确保没有其他线程可以进入同步块。不太熟悉但同样重要的是

(1) 获取锁并输入同步块将强制线程刷新内存中的数据。 (2) 退出同步块后,写入的数据将刷新到内存中。


另请参见JDK1.5发布的JSR133(Java内存模型和线程规范修订版)。

您能更清楚地了解“可见性”问题的含义吗?