台式机&硬件面试官最爱的 volatile 关键字,这些问题你都搞懂了没?( 二 )
即 , volatile的特殊规则就是:
read、load、use动作必须连续出现 。
assign、store、write动作必须连续出现 。
所以 , 使用volatile变量能够保证:
每次读取前必须先从主内存刷新最新的值 。
每次写入后必须立即同步回主内存当中 。
也就是说 , volatile关键字修饰的变量看到的是自己的最新值 。 线程1中对变量v的最新修改 , 对线程2是可见的 。
禁止指令重排序优化:
volatile boolean isOK = false //假设以下代码在线程A执行A.init()isOK=true //假设以下代码在线程B执行while(!isOK){ sleep()}B.init()
A线程在初始化的时候 , B线程处于睡眠状态 , 等待A线程完成初始化的时候才能够进行自己的初始化 。 这里的先后关系依赖于isOK这个变量 。
如果没有volatile修饰isOK这个变量 , 那么isOK的赋值就可能出现在A.init()之前(指令重排序,Java虚拟机的一种优化措施) , 此时A没有初始化 , 而B的初始化就破坏了它们之前形成的那种依赖关系 , 可能就会出错 。
知识拓展:指令重排序:
概念:指令重排序是JVM为了优化指令 , 提高程序运行效率 , 在不影响 单线程程序 执行结果的前提下 , 尽可能地提高并行度 。 编译器、处理器也遵循这样一个目标 。 注意是单线程 。 多线程的情况下指令重排序就会给程序带来问题 。
不同的指令间可能存在数据依赖 。 比如下面的语句:
int l = 3 // (1) int w = 4 // (2) int s = l * w // (3)
面积的计算依赖于l与w两个变量的赋值指令 。 而l与w无依赖关系 。
重排序会遵守两个规则:
as-if-serial规则:as-if-serial规则是指不管如何重排序(编译器与处理器为了提高并行度) , (单线程)程序的结果不能被改变 。 这是编译器、Runtime、处理器必须遵守的语义 。
happens-before规则:
程序顺序规则:一个线程中的每个操作 , happens-before于线程中的任意后续操作 。
监视器锁规则:一个锁的解锁 , happens-before于随后对这个锁的加锁 。
volatile变量规则:对一个volatile域的写 , happens-before于任意后续对这个volatile域的读 。
传递性:如果(A)happens-before(B) , 且(B)happens-before(C) , 那么(A)happens-before(C) 。
线程start()规则:主线程A启动线程B , 线程B中可以看到主线程启动B之前的操作 。 也就是start() happens-before 线程B中的操作 。
线程join()规则:主线程A等待子线程B完成 , 当子线程B执行完毕后 , 主线程A可以看到线程B的所有操作 。 也就是说 , 子线程B中的任意操作 , happens-before join()的返回 。
中断规则:一个线程调用另一个线程的interrupt , happens-before于被中断的线程发现中断 。
终结规则:一个对象的构造函数的结束 , happens-before于这个对象finalizer的开始 。
概念:前一个操作的结果可以被后续的操作获取 。 讲直白点就是前面一个操作把变量a赋值为1 , 那后面一个操作肯定能知道a已经变成了1 。
happens-before(先行发生)规则如下:
虽然 , (1)-happensbefore ->(2),(2)-happens before->(3) , 但是计算顺序(1)(2)(3)与(2)(1)(3)对于l、w、area变量的结果并无区别 。 编译器、Runtime在优化时可以根据情况重排序(1)与(2) , 而丝毫不影响程序的结果 。
volatile使用场景:
1、对变量的写操作不依赖当前变量的值 。
2、该变量没有包含在其他变量的不变式中 。
如果正确使用volatile的话 , 必须依赖下以下种条件:
也可以这样理解 , 就是上面的2个条件需要保证操作是原子性操作 , 才能保证使用volatile关键字的程序在并发时能够正确执行 。
推荐阅读
- 常州发布|温差10℃+!白露已至,真的“凉凉”了?
- 第一财经|日本富豪前泽友作炒股赔44亿日元 “深深的悔恨”帖 请查收
- 中华人民共和国应急管理部|国家防总提升防汛防台风应急响应至Ⅲ级 应急管理部部署消防专业救援力量跨区域增援吉林、黑龙江
- 交通运输部|交通强国·试点先行 | 综合交通枢纽体系怎么建?
- 森林|半藏森林晒新图被喷:没男人给买房怂了?回怼"我买了,你呢?"
- 穿搭|今年秋天流行穿"短一截",不用腰带也能穿出大长腿,小个子福音
- 王思聪带女生现身楼盘看房|太豪气!王思聪带女生现身楼盘看房上热搜 哪位网红获"国民老公"青睐?
- 男性养生|长寿的男性,身体多有"3大、2小",占得越多,长寿离你越近
- 瑞银集团|瑞银钱于军:未来中国资本市场进一步开放 很多外资会摩拳擦掌
- 故宫|文物也“去中国化”?苏贞昌扬言台北故宫文物属于"2300万人"
