- volatile介绍
是什么: volatile是一个关键字,用来修饰变量的,使变量具有某种特点。
1. 那么它具体有什么作用:
被volatile修饰的变量 的特点: 可见性,有序性(注意没有原子性)
下面简单介绍两个特点:
1. 可见性:
线程在修改完变量后立即刷新回主内存并及时发出通知,大家可以去主内存拿最新版,前面的修改对后面所有线程可见。
2. 有序性(禁重排序):
ps:为什么在平常我们程序使用中没有禁重排序这个问题呢?然后数据依赖性是什么?
看图
所以多线程操作间会需要禁重排序。
。
。
。
OK,在复习了下volatile的特点后,让我们具体看一下使用volatile的操作====>读写操作
2. 对volatile变量读写操作:
在介绍volatile作用时只是大概描述其特点,其具体实现还需要看读写操作。
为什么volatile修饰的可以在 读时:读到最新的数据。写时:写入数据到本地内存时立刻存到内存。两者都是因为内存屏障。
。
。
内存屏障定义: 内存屏障是一种屏障指令,它使得CPU或编译器对屏障指令的前 和 后 所发出的内存操作 执行一个排序的约束。也叫内存栅栏或.栅栏指令
读屏障和写屏障和全屏障(没写)是初略划分,还有细致划分为四个类型。
在介绍内存屏障之前,我们先了解一下volatile的内部结构:
volatile内部结构:
==>
由volatile内部结构因此引出内存屏障的四个类型
内存屏障的四个类型:
1. 读屏障(Load Barrier):
在读指令之前插入读屏障,让工作内存或CPU高速缓存当中的缓存数据失效,重新回到主内存中获取最新数据
2. 写屏障(Store Barrier):
在写指令之后插入写屏障,强制把写缓冲区的数据刷回到主内存中
这些屏障运用于读操作和写操作来保持有序性。
3. 课后思考:如果没有禁重排序呢?实例
1. 问题
2. 分析
3. 解决