Volatile作用

大兔子大兔子 提交于 2020-01-25 21:38:06

volatile的用处:

在JDK1.2之前,Java内存模型总是从主存(共享内存)中读取变量值,是不需要进行特别注意的。

在当前Java内存模型下,线程可以把变量保存在本地内存,如寄存器中,而不是直接在主存中进行读写。这就造成了一个线程在主存中修改了一个变量的值,而另一个线程还在使用它在寄存器中的变量值的拷贝,造成了了数据不一致。

为了解决这个问题,我们就需要把该变量声明为volatile,这就指示JVM,这个变量是不稳定的,每次使用他都要去主存中读取,而不是本地内存,一般说来,多任务环境下,各任务间共享的变量,都应该使用volatile进行修饰。

 

volatile修饰的变量,在被每次线程访问时,都强迫从共享内存中重读该变量的值。而且当该变量变化时,都强迫线程将变化的值写到共享内存中,这样在任何时刻,两个不同的线程总是看到该变量的同一个值。

 

Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才将私有拷贝与共享内存中的原始值进行比较。

这样当多个线程同时与某个对象交互时,就必须注意到要让线程及时的得到共享成员变量的变化。而volatile关键字就是提示JVM:对于这个成员变量,不能保存它的私有拷贝,而应直接与共享成员变量交互。

volatile是一种稍弱的同步机制,在访问volatile变量时不会执行加锁操作,也就不会执行线程阻塞,因此volatilei变量是一种比synchronized关键字更轻量级的同步机制。

 

volatile可以保证可见性

volatile不能保证操作的原子性。

volatile会影响效率。

总结:

因为线程可以有自己的缓存空间,本地内存,所以读取一个变量就不一定是共享内存了,多个线程操作时,有可能一个线程修改了变量,一个线程还在使用该变量拷贝的私有变量值,造成数据不一致。使用volatile,可以强迫线程无论是访问还是修改都必须在主存中,或是写进主存,可以让多个线程总是读取同一个变量值。但是多核的情况下,volatile仍然不能保证原子性,而且volatile会屏蔽JVM的必要的代码优化,会影响效率。他只是一种轻量级的同步机制。所以尽量还是使用synchronized吧。

 

主要作用:

1.禁止指令重排

2.保证修饰的变量可见性(但不保证原子性)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!