Java 易失性是否阻止缓存或强制实施直写缓存?
我试图理解Java的关键字,即在具有CPU缓存的多线程程序中写入易失性原子变量。volatile
我已经阅读了几个教程和Java语言规范,特别是关于“在排序之前发生”的第17.4.5节。我的理解是,当线程将新值写入易失性变量时,更新后的值必须对读取该变量的其他线程可见。对我来说,这些语义可以通过以下两种方式之一实现:
线程可以在 CPU 缓存中缓存易失性变量,但对缓存中变量的写入必须立即刷新到主内存。换句话说,缓存是直写的。
线程永远无法缓存易失性变量,并且必须在主内存中读取和写入此类变量。
本教程(http://tutorials.jenkov.com)中提到了方法 1,它说:
通过声明计数器变量易失性,对计数器变量的所有写入都将立即写回主内存。
方法 2 在 Stackoverflow 问题“Java 中的易失性变量”中提到,本教程还说:
此变量的值永远不会在本地线程缓存:所有读取和写入都将直接进入“主内存”
哪一种是Java中使用的正确方法?
相关的堆栈溢出问题没有回答我的问题: