JRS133为什么要增强volatile的语义?
线程A的1和线程B和4并不满足happen before原则, 为什么要保证1和4的可见性呢?
而且即使通过禁止volatile读和普通变量读/写的重排序, 那由于1和4不满足happen before原则, 也可能出现4先执行1后执行的情况, 导致1的修改对于4来说不可见呀? 那么增强volatile的语义有什么用呢?
回答:
//线程1:
context = loadContext(); //语句1
inited = true; //语句2
//线程2:
while(!inited ){
sleep()
}
doSomethingwithconfig(context);
这里inited为volatile变量,如果非volatile变量和volatile之间可以重排,那么线程2执行的时候可能context还没有初始化。你不要把volatile放到非...变量前来使用,volatile保证他之前的语句一定执行完了,所以如果inited为true的话,context是一定被初始化了的。
回答:
同样引用 《并发编程艺术里》的一节,hb规则解释如下
程序顺序规则:一个线程中的每个操作,hb于该线程中的任意后续操作
监视器锁规则:对一个锁的解锁。hb于随后对这个锁的加锁
volatile变量规则:对一个volatile域的写,hb于任意后续对这个volatile域的读
传递性:如果A hb B,且B hb C ,那么A hb C
我并没有发现 “线程A的1和线程B和4并不满足happen before原则”
在该书的第40页有对hb规则示例解释,这本书之所以让人疑惑,是因为他的语言组织有问题。
注意它说的是1和2之间重排序。之间这个词用的很蛋疼。
以上是 JRS133为什么要增强volatile的语义? 的全部内容, 来源链接: utcz.com/p/178325.html