天堂一区_新91在线_在线免费观看污污视频_99热只有精品在线观看_人人看黄色_www.97色.com

首页 |

并发编程:volatile关键字,你学会了吗?


来源:今日头条

一、64位写入的原子性(Half Write)

如,对于一个long型变量的赋值和取值操作而言,在多线程场景下,线程A调用set(100),线程B调 用get(),在某些场景下,返回值可能不是100。

因为JVM的规范并没有要求64位的long或者double的写入是原子的。在32位的机器上,一个64位变 量的写入可能被拆分成两个32位的写操作来执行。这样一来,读取的线程就可能读到“一半的值”。解决 办法也很简单,在long前面加上volatile关键字。

二、重排序:DCL问题

单例模式的线程安全的写法不止一种,常用写法为DCL(Double Checking Locking),如下所示:


(资料图)

上述的 instance = new Singleton(); 代码有问题:其底层会分为三个操作:

1. 分配一块内存。

2. 在内存上初始化成员变量。

3. 把instance引用指向内存。

在这三个操作中,操作2和操作3可能重排序,即先把instance指向内存,再初始化成员变量,因为 二者并没有先后的依赖关系。此时,另外一个线程可能拿到一个未完全初始化的对象。这时,直接访问 里面的成员变量,就可能出错。这就是典型的“构造方法溢出”问题。 解决办法也很简单,就是为instance变量加上volatile修饰。

volatile的三重功效:64位写入的原子性、内存可见性和禁止重排序。

三、volatile实现原理

由于不同的CPU架构的缓存体系不一样,重排序的策略不一样,所提供的内存屏障指令也就有差 异。 这里只探讨为了实现volatile关键字的语义的一种参考做法:

1. 在volatile写操作的前面插入一个StoreStore屏障。保证volatile写操作不会和之前的写操作重 排序。

2. 在volatile写操作的后面插入一个StoreLoad屏障。保证volatile写操作不会和之后的读操作重 排序。

3. 在volatile读操作的后面插入一个LoadLoad屏障+LoadStore屏障。保证volatile读操作不会和 之后的读操作、写操作重排序。

具体到x86平台上,其实不会有LoadLoad、LoadStore和StoreStore重排序,只有StoreLoad一种 重排序(内存屏障),也就是只需要在volatile写操作后面加上StoreLoad屏障。

四、JSR-133对volatile语义的增强

在JSR -133之前的旧内存模型中,一个64位long/ double型变量的读/ 写操作可以被拆分为两个32位 的读/写操作来执行。从JSR -133内存模型开始 (即从JDK5开始),仅仅只允许把一个64位long/ double 型变量的写操作拆分为两个32位的写操作来执行,任意的读操作在JSR -133中都必须具有原子性(即 任 意读操作必须要在单个读事务中执行)。

相关阅读

主站蜘蛛池模板: 亚洲国产精品无码久久电影 | 亚洲高清一区二区三区 | 无码人妻一区二区三区在线 | 国产人成 | 国产精品青草久久久久婷婷 | 国产美女特级嫩嫩嫩bbb | 国产成人精品综合 | 免费在线一级毛片 | 大桥未久亚洲无av码在线 | 免费精品美女久久久久久久久久 | 久久久久久久国产视频 | 99国产精品久久99久久久 | 岳好紧好湿夹太紧了好爽 | 99精品中文字幕 | 在线天堂中文www视软件 | 成人禁在线观看午夜亚洲 | 久久精品美女 | 成人国产精品高清在线观看 | 国产综合成人观看在线 | 日韩中文字幕一在线 | 国产一级免费在线观看 | 五十路熟女一区二区三区 | 麻豆精品永久免费视频 | 99国产国人青青视频在线观看 | 精品久久久久久久久久中文字幕 | 女人扒开屁股爽桶30分钟 | 精品国产精品a | 国产真实伦视频在线视频 | 一级毛片一级毛片一级毛片 | 最近中文字幕视频完整版在线看 | 久久精品国产亚洲一区二区 | 久久久噜噜噜久久老司机 | 大伊香蕉精品视频在线 | 黄色片网站免费 | 天天综合色天天综合色sb | 成人男女拍拍拍在线视频 | 大陆国产精品视频 | 免费在线国产视频 | 欧美性色欧美a在线图片 | 久草在在线 | 婷婷色中文网 |