happens-before用来保证两个操作直接的可见性。
这里的两个操作,即可以在一个线程,也可以在多个线程中。
1.如果一个操作happens-before另一个操作,那么第一个操作的执行结果,将对第二个操作可见。(保证可见性)
而且第一个操作的执行顺序排在第二个操作之前。(JMM对程序做出的逻辑保障,并不是代码指令真正的执行保证)
2.即使两个操作之间存在happens-before关系,并不意味着Java平台的实现必须要按照happens-before关系指定的顺序执行。
因此,
第一条是JMM对于程序员做出的一个逻辑保障。
第二条是JMM对编译器,处理器重排序的约束原则。只要不改变程序的执行结果(不管是单线程还是多线程)。编译器,处理器怎么优化都可以。
一个线程中的每个操作happens-before该线程中任意后续操作。
对一个锁的解锁操作happens-before随后对这个锁的加锁。
对volatile修饰的字段进行的写操作happens-before任意后续对这个volatile修饰的字段进行的读操作。
如下面的代码,run方法的第一行一定happens-beforerun方法的第二行。在多线程环境下也是如此。在每次对num赋值的时候,会强制刷新进主内存。让其它缓存持有num失效。
private volatile int num=0;
//新线程
void run(){
num=9;
int a=num;
}
其实这个非常好理解,没什么好说的,第一行happens-before第二行,第二行happens-before第三行,那么第一行happens-before第三行
int a=1;
int b=6;
int c=a=b;
如果在线程A里面去执行线程B的start,那么在线程A里面的B.start()操作happens-before线程B中的任意操作。
这个是非常好理解的。写过多线程一看就明白。
如果在线程A里面去执行线程B.join(),那么在线程B里面的任意操作 happens-before线程A中执行了线程B.join()之后的操作。
没什么好说的,就是把join的特性说了一遍。