台式机&硬件面试官最爱的 volatile 关键字,这些问题你都搞懂了没?( 三 )
第一个条件的限制使 volatile 变量不能用作线程安全计数器 。 虽然增量操作(i++)看上去类似一个单独操作 , 实际上它是一个由(读取-修改-写入)操作序列组成的组合操作 , 必须以原子方式执行 , 而 volatile 不能提供必须的原子特性 。
实现正确的操作需要使 i 的值在操作期间保持不变 , 而 volatile 变量无法实现这点 。
在以下两种情况下都必须使用volatile:
1、状态的改变 。
2、读多写少的情况 。
具体如下:
// 场景一:状态改变 /** * 双重检查(DCL) */public class Sun { private static volatile Sun sunInstance private Sun() { } public static Sun getSunInstance() { if (sunInstance == null) { synchronized (Sun.class) { if (sunInstance == null){ sunInstance = new Sun() } } } return sunInstance }} // 场景二:读多写少 public class VolatileTest { private volatile int value //读操作 , 没有synchronized , 提高性能 public int getValue() { return value } //写操作 , 必须synchronized 。 因为x++不是原子操作 public synchronized int increment() { return value++ }}
问题来了 , volatile是如何防止指令重排序优化的呢?
答:
volatile关键字通过 “内存屏障” 的方式来防止指令被重排序 , 为了实现volatile的内存语义 , 编译器在生成字节码时 , 会在指令序列中插入内存屏障来禁止特定类型的处理器重排序 。 大多数的处理器都支持内存屏障的指令 。
对于编译器来说 , 发现一个最优布置来最小化插入屏障的总数几乎不可能 , 为此 , Java内存模型采取保守策略 。 下面是基于保守策略的JMM内存屏障插入策略:
在每个volatile写操作的前面插入一个StoreStore屏障 。
在每个volatile写操作的后面插入一个StoreLoad屏障 。
在每个volatile读操作的后面插入一个LoadLoad屏障 。
在每个volatile读操作的后面插入一个LoadStore屏障 。
知识拓展:内存屏障:
内存屏障(Memory Barrier , 或有时叫做内存栅栏 , Memory Fence)是一种CPU指令 , 用于控制特定条件下的重排序和内存可见性问题 。 Java编译器也会根据内存屏障的规则禁止重排序 。
内存屏障可以被分为以下几种类型:
LoadLoad屏障:对于这样的语句Load1 LoadLoad Load2 , 在Load2及后续读取操作要读取的数据被访问前 , 保证Load1要读取的数据被读取完毕 。
StoreStore屏障:对于这样的语句Store1 StoreStore Store2 , 在Store2及后续写入操作执行前 , 保证Store1的写入操作对其它处理器可见 。
LoadStore屏障:对于这样的语句Load1 LoadStore Store2 , 在Store2及后续写入操作被刷出前 , 保证Load1要读取的数据被读取完毕 。
StoreLoad屏障:对于这样的语句Store1 StoreLoad Load2 , 在Load2及后续所有读取操作执行前 , 保证Store1的写入对所有处理器可见 。 它的开销是四种屏障中最大的 。 在大多数处理器的实现中 , 这个屏障是个万能屏障 , 兼具其它三种内存屏障的功能 。
本文插图
声明:转载此文是出于传递更多信息之目的 。 若有来源标注错误或侵犯了您的合法权益 , 请作者持权属证明与本网联系 , 我们将及时更正、删除 , 谢谢 。邮箱地址:newmedia@xxcb.cn
【台式机&硬件面试官最爱的 volatile 关键字,这些问题你都搞懂了没?】
推荐阅读
- 常州发布|温差10℃+!白露已至,真的“凉凉”了?
- 第一财经|日本富豪前泽友作炒股赔44亿日元 “深深的悔恨”帖 请查收
- 中华人民共和国应急管理部|国家防总提升防汛防台风应急响应至Ⅲ级 应急管理部部署消防专业救援力量跨区域增援吉林、黑龙江
- 交通运输部|交通强国·试点先行 | 综合交通枢纽体系怎么建?
- 森林|半藏森林晒新图被喷:没男人给买房怂了?回怼"我买了,你呢?"
- 穿搭|今年秋天流行穿"短一截",不用腰带也能穿出大长腿,小个子福音
- 王思聪带女生现身楼盘看房|太豪气!王思聪带女生现身楼盘看房上热搜 哪位网红获"国民老公"青睐?
- 男性养生|长寿的男性,身体多有"3大、2小",占得越多,长寿离你越近
- 瑞银集团|瑞银钱于军:未来中国资本市场进一步开放 很多外资会摩拳擦掌
- 故宫|文物也“去中国化”?苏贞昌扬言台北故宫文物属于"2300万人"
