位置:南通科迅教育IT培训机构 > 学校动态 > java并发编程之volatile关键字
java并发编程之volatile关键字
来源:南通科迅教育IT培训机构时间:2020/7/3 16:30:22
一、volatile使用方式
1、用作全局标志
我们在开发中,对于一个死循环线程的控制,基本上是要用到一个全局的开关标志的
例如
结果
如果不设置stop变量为volatile,并不意味着程序一定不会结束
因为这个stop变量的刷新操作也需要看cpu的处理方式
但是加上volatile一定不会出现问题
2、防止重排序
单例中的双重检查加锁示例demo
为什么要将singleton设置为volatile呢?
实例化一个对象其实可以分为三个步骤:
(1)分配内存空间。
(2)初始化对象。
(3)将内存空间的地址赋值给对应的引用。
但是由于操作系统可以对指令进行重排序,所以上面的过程也可能会变成如下过程:
(1)分配内存空间。
(2)将内存空间的地址赋值给对应的引用。
(3)初始化对象
如果是这个流程,多线程环境下就可能将一个未初始化的对象引用暴露出来
为了防止这个过程的重排序,我们需要将变量设置为volatile类型的变量。
二、volatile作用
volatile解决了可见性和有序性问题
那他是怎么解决这些问题的呢?
1、可见性问题
(1)立即将cpu缓存中数据写回到内存中
(2)其他处理器通过嗅探总线上传播过来了数据监测自己缓存的值是不是过期了,如果过期了,就会对应的缓存中的数据置为无效。而当处理器对这个数据进行修改时,会重新从内存中把数据读取到缓存中进行处理。
2、有序性问题
内存屏障增加了volatile的有序性
内存屏障其实就是一个CPU指令,在硬件层面上来说可以扥为两种:LoadBarrier和StoreBarrier即读屏障和写屏障。主要有两个作用:
(1)阻止屏障两侧的指令重排序;
(2)强制把写缓冲区/高速缓存中的脏数据等写回主内存,让缓存中相应的数据失效。
尊重原创文章,转载请注明出处与链接:http://www.peixun360.com/2449/news/211675/违者必究!
以上就是南通科迅教育IT培训机构 小编为您整理 java并发编程之volatile关键字的全部内容。