Java中,被volatile修饰的变量是否每次读都从主内存读取?

新手上路,请多包涵

说法1:只有缓存被其他线程修改过后,无效了才会从主内存中读,不然还是可以用自己工作内存中缓存的。
说法2:被volatile修饰的变量每次读都从主内存读取。
求大神解答,底层是什么样的,符合哪种说法?

阅读 2.9k
2 个回答

这个其实得看 JVM 的 C/C++ 层是咋实现的。

Java 里规定这个关键词要干两件事:

  1. 写操作后 JMM 要把最新值强刷到主内存;
  2. 写操作会导致其他线程中的缓存无效。

其实并没说要不要每次都从主内存里读取。

但往往 JVM 在底层实现上用的还是 C++ 的 volatile 语法,所以从现有实现上看都是后者

话说回来的话真要有一天某个 JVM 不是这么实现的,前者就也不算错。

Java 还真没规定这个。

volatitle 多用于并发,mesi 协议虽然能保证单线程缓存的准确性,确对并行束手无策。jvm 针对于 volatitle 的 read,load,use ; assign, store, write 是进行了原子优化的。

推荐问题