volatile关键字

关于volatile关键字的一些问题

Java内存模型是什么

如下面两张图所示(这里JavaGuide画的图就很好,直接拿来了,侵删),变量是放在主存中的,每个线程都有自己的工作内存(本地内存),线程运行时将主存中的数据复制到工作内存当中,对数据的任何操作都是基于自己的工作内存进行的,之后再将更新后的数据刷新到主存。

当前线程不能直接操作主存和其他线程工作内存中的数据。

JMM(Java 内存模型)
JMM(Java 内存模型)强制在主存中进行读取

volatile关键字的作用

volatile关键字保证了变量的立即可见性

线程A线程B并发运行时可能出现这种情况,如果线程A修改了工作内存中的数据且还未同步到主存,那么线程B读取的主存中的数据就不是最新值。当变量被volatile关键字修饰后,任何线程对它的写操作都会强制将工作内存中的最新值刷新到主存,同时使其他线程工作内存中的变量缓存无效,这样其他线程使用缓存时就会重新到主存中读取最新值。

即如果我们将变量声明为 volatile ,这就指示 JVM,这个变量是共享且不稳定的,每次使用它都到主存中进行读取。

volatile 关键字能保证数据的可见性,但不能保证数据的原子性。synchronized 关键字两者都能保证。