happens-before定义
happens-before用来指定两个操作之间的执行顺序,如果A线程的写操作与B线程的读操作之间存在happens-before关系,尽管写操作和读操作在不同的线程中执行,但JMM向程序员保证写操作的结果将对读操作可见。我的理解是,JMM通过happens-before规则定义了一个规范,向程序员提供一种简单可靠的跨线程内存可见性的保证,规范对编译器和处理器的重排序做了约束(尽可能的利用了CPU的指令优化)。具体解释如下:
- 如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。
- 两个操作之间存在happens-before关系,并不意味着Java平台的具体实现必须要按照happens-before关系指定的顺序来执行。如果重排序之后的执行结果,与按happens-before关系来执行的结果一致,那么这种重排序并不非法(也就是说,JMM允许这种重排序)
上面的1)是JMM对程序员的承诺。从程序员的角度来说,可以这样理解happens-before关系:如果A happens-before B,那么Java内存模型将向程序员保证——A操作的结果将对B可见,且A的执行顺序排在B之前。注意,这只是Java内存模型向程序员做出的保证!
上面的2)是JMM对编译器和处理器重排序的约束原则。正如前面所言,JMM其实是在遵循一个基本原则:只要不改变程序的执行结果(指的是单线程程序和正确同步的多线程程序),编译器和