说法1:只有缓存被其他线程修改过后,无效了才会从主内存中读,不然还是可以用自己工作内存中缓存的。
说法2:被volatile修饰的变量每次读都从主内存读取。
求大神解答,底层是什么样的,符合哪种说法?
说法1:只有缓存被其他线程修改过后,无效了才会从主内存中读,不然还是可以用自己工作内存中缓存的。
说法2:被volatile修饰的变量每次读都从主内存读取。
求大神解答,底层是什么样的,符合哪种说法?
volatitle 多用于并发,mesi 协议虽然能保证单线程缓存的准确性,确对并行束手无策。jvm 针对于 volatitle 的 read,load,use ; assign, store, write 是进行了原子优化的。
8 回答2.9k 阅读
2 回答5.2k 阅读✓ 已解决
5 回答1.5k 阅读
4 回答1.6k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答2.2k 阅读
1 回答2.6k 阅读✓ 已解决
这个其实得看 JVM 的 C/C++ 层是咋实现的。
Java 里规定这个关键词要干两件事:
其实并没说要不要每次都从主内存里读取。
但往往 JVM 在底层实现上用的还是 C++ 的 volatile 语法,所以从现有实现上看都是后者。
话说回来的话真要有一天某个 JVM 不是这么实现的,前者就也不算错。
Java 还真没规定这个。