Java中volatile的确切含义和影响? [复制]

Posted

技术标签:

【中文标题】Java中volatile的确切含义和影响? [复制]【英文标题】:Precise meaning and effects of volatile in Java? [duplicate] 【发布时间】:2016-07-14 03:03:06 【问题描述】:

受Why does BufferedInputStream copy a field to a local variable rather than use the field directly 问题启发的问题。

其中一位分析员对“volatile”关键字这么说:

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

这似乎表明,如果一个变量 NOT 声明为 volatile,则不会出现“更改将立即反映在所有其他线程中”的情况,或者 IOW,“更改为变量只会在以后反映”。

问题:

(a) 这种理解正确吗? (b) 如果是这样,当 ARE 发生变化然后应用/暴露给其他线程?

【问题讨论】:

存在很多关于 SO 的现有问题,例如“volatile 是什么意思/做什么?” - 都不够吗? 哦-您的实际问题似乎是“非易失性变量的行为是什么?” - 准确吗? 【参考方案1】:

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

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

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

【讨论】:

以上是关于Java中volatile的确切含义和影响? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

[转] java中volatile关键字的含义

java中volatile关键字的含义

java中volatile关键字的含义

java中volatile关键字的含义

java中volatile关键字的含义

java中volatile关键字的含义