问题的灵感来自Why does BufferedInputStream copy a field to a local variable rather than use the field directly的问题。
其中一位选手说这是关于" volatile"关键字:
"此外,它被声明为volatile,这意味着如果任何线程更改了变量的值,则此更改将立即反映在所有其他线程中。"
这似乎暗示如果变量是 NOT 声明为volatile,那么"更改将不会立即反映在所有其他线程中#34;或IOW ,"对变量的更改将仅在稍后反映"。
问题:
(一)理解正确吗? (b)如果是这样,当精确 ARE 更改然后应用/暴露给其他线程?
答案 0 :(得分:2)
Java volatile
关键字用于将变量/字段标记为存储在主存储器中,更准确的说,每次访问变量时,都会将其读/写到主计算机内存中。不是来自/到CPU缓存。
在典型的多线程应用程序中,当启动多个线程时,它们可能会将非voalatile 变量的副本从主内存复制到CPU缓存,因此每个线程都会拥有它自己的变量副本,这主要是出于性能原因。鉴于此,无法保证JVM何时回读将非易失性变量状态写回主存储器。
volatile
关键字保证用此修饰符标记的变量将写入计算机主内存。