关于多线程 happens-before的,有这么几个规则(JDK1.5):
程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作。
监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁。
volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读。
传递性:如果A happens-before B,且B happens-before C,那么A happens-before C。
《java并发编程的艺术》中提到这么一个例子:
假设线程A执行writer()方法之后,线程B执行reader()方法。根据happens-before规则,这个
过程建立的happens-before关系可以分为3类:
1)根据程序次序规则,1 happens-before 2;3 happens-before 4。
2)根据volatile规则,2 happens-before 3。
3)根据happens-before的传递性规则,1 happens-before 4。
上述happens-before关系的图形化表现形式如下。
这里的1)根据程序次序规则,1 happens-before 2;3 happens-before 4。
这个是我不理解的,如果这个成立,那么该书上另外一个例子就有问题了。
另一个例子为:
书上说可能:
这里矛盾了啊,上图中根据happens-before,读对象的普通域i不能重排序到读对象的final域j上面去啊。
到底哪个例子正确,求解!