volatile关键字
关于volatile关键字的一些问题
Java内存模型是什么
如下面两张图所示(这里JavaGuide画的图就很好,直接拿来了,侵删),变量是放在主存中的,每个线程都有自己的工作内存(本地内存),线程运行时将主存中的数据复制到工作内存当中,对数据的任何操作都是基于自己的工作内存进行的,之后再将更新后的数据刷新到主存。
当前线程不能直接操作主存和其他线程工作内存中的数据。
volatile关键字的作用
volatile关键字保证了变量的立即可见性
线程A
与线程B
并发运行时可能出现这种情况,如果线程A
修改了工作内存中的数据且还未同步到主存,那么线程B
读取的主存中的数据就不是最新值。当变量被volatile关键字修饰后,任何线程对它的写操作都会强制将工作内存中的最新值刷新到主存,同时使其他线程工作内存中的变量缓存无效,这样其他线程使用缓存时就会重新到主存中读取最新值。
即如果我们将变量声明为 volatile
,这就指示
JVM,这个变量是共享且不稳定的,每次使用它都到主存中进行读取。
volatile
关键字能保证数据的可见性,但不能保证数据的原子性。synchronized
关键字两者都能保证。