Happens-Before 并不是说前面一个操作发生在后续操作的前面, 它真正要表达的是: 前面一个操作的结果对后续操作是可见的。
一、理解happens-before
1、如果⼀个操作happens-before另⼀个操作,那么第⼀个操作的执⾏结果将对第⼆个操作可⻅,⽽且第⼀个操作的执⾏顺序排在第⼆个操作之前。
2、两个操作之间存在happens-before关系,并不意味着Java平台的具体实现必须要按照happens-before关系指定的顺序来执⾏。如果重排序之后的执⾏结果,与按happens-before关系来执⾏的结果⼀致,那么JMM也允许这样的重排序。
如果操作A happens-before操作B,那么操作A在内存上所做的操作对操作B都是可⻅的,不管它们在不在⼀个线程
happens-before关系本质上和as-if-serial语义是⼀回事。as-if-serial语义保证单线程内重排序后的执⾏结果和程序代码本身应有的结果是⼀致的,happens-before关系保证正确同步的多线程程序的执⾏结果不被重排序改变
二、happens-before规则
下边前三个规则,都可以看这个例子来理解
class VolatileExample{
int a=0;
volatile boolean flag=false;
public void writer(){
a=1; // 操作1
flag=true; // 操作2
}
public void reader()