“`” 在 JDK1.2 之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的。而在当前的 Java 内存模型下,线程可以把变量保存本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致

</p>

<div class=""img-item"" data-src=""https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/%E6%95%B0%E6%8D%AE%E4%B8%8D%E4%B8%80%E8%87%B4.png"" data-sub-html="".caption""><img src=""http://res.mianshigee.com/upload/article/20200405/1e7f7cf5-355f-4cfb-9ab4-0a70f81f296b.png"" style=""width: 273px;""><br><div class=""caption""><b class=""center-caption"">数据不一致</b></div></div>

要解决这个问题,就需要把变量声明为<strong>volatile</strong>,这就指示 JVM,这个变量是不稳定的,每次使用它都到主存中进行读取。

说白了, <strong>volatile</strong> 关键字的主要作用就是保证变量的可见性然后还有一个作用是防止指令重排序。

<div class=""img-item"" data-src=""https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/volatile%E5%85%B3%E9%94%AE%E5%AD%97%E7%9A%84%E5%8F%AF%E8%A7%81%E6%80%A7.png"" data-sub-html="".caption""><img src=""http://res.mianshigee.com/upload/article/20200405/e24c0272-fb8a-423b-b862-a6247264873d.png"" style=""width: 474px;""><br><div class=""caption""><b class=""center-caption"">volatile关键字的可见性</b></div></div>

<pre><code> "“`

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.