我正在尝试理解Javavolatile
关键词关于writing具有 CPU 缓存的多线程程序中的易失性原子变量。
我读过一些教程和 Java 语言规范,特别是第 17.4.5 节“在订购之前发生” http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4.5。我的理解是,当线程将新值写入易失性变量时,更新的值必须对读取该变量的其他线程可见。对我来说,这些语义可以通过以下两种方式之一实现:
线程可以在 CPU 缓存中缓存易失性变量,但对缓存中变量的写入必须立即刷新到主内存。换句话说,缓存是直写式 https://en.wikipedia.org/wiki/Cache_(computing)#WRITEPOLICIES.
线程永远不能缓存易失性变量,并且必须在主内存中读取和写入此类变量。
这里提到了方法1tutorial http://tutorials.jenkov.com/java-concurrency/volatile.html (http://tutorials.jenkov.com http://tutorials.jenkov.com) 说的是:
通过将计数器变量声明为易失性,所有写入计数器
变量将立即写回主存。
Stackoverflow问题中提到了方法2“Java中的易失性变量 https://stackoverflow.com/questions/6259745/volatile-variable-in-java“还有这个tutorial http://www.javamex.com/tutorials/synchronization_volatile.shtml说的是:
该变量的值永远不会在线程本地缓存:全部
读取和写入将直接进入“主存储器”
Java 中使用的正确方法是哪一种?
相关的 Stackoverflow 问题not回答我的问题:
Java中的易失性变量 https://stackoverflow.com/questions/6259745/volatile-variable-in-java
Java 易失性读取是否刷新写入,以及易失性写入是否更新读取 https://stackoverflow.com/questions/35808193/does-java-volatile-read-flush-writes-and-does-volatile-write-update-reads
Java 易失性和缓存一致性 https://stackoverflow.com/questions/21129018/java-volatile-and-cache-coherence