Java中volatile的精确含义和效果?

时间:2016-03-26 12:49:29

标签: java volatile

问题的灵感来自Why does BufferedInputStream copy a field to a local variable rather than use the field directly的问题。

其中一位选手说这是关于" volatile"关键字:

"此外,它被声明为volatile,这意味着如果任何线程更改了变量的值,则此更改将立即反映在所有其他线程中。"

这似乎暗示如果变量是 NOT 声明为volatile,那么"更改将不会立即反映在所有其他线程中#34;或IOW ,"对变量的更改将仅在稍后反映"。

问题:

(一)理解正确吗? (b)如果是这样,当精确 ARE 更改然后应用/暴露给其他线程?

1 个答案:

答案 0 :(得分:2)

Java volatile关键字用于将变量/字段标记为存储在主存储器中,更准确的说,每次访问变量时,都会将其读/写到主计算机内存中。不是来自/到CPU缓存。

在典型的多线程应用程序中,当启动多个线程时,它们可能会将非voalatile 变量的副本从主内存复制到CPU缓存,因此每个线程都会拥有它自己的变量副本,这主要是出于性能原因。鉴于此,无法保证JVM何时回读将非易失性变量状态写回主存储器。

volatile关键字保证用此修饰符标记的变量将写入计算机主内存。