-
程序顺序规则:一个线程中的每个操作,该线程中的任意后续动作都必须可以看到前面操作的结果,所以happens-before于该线程的任意后续动作
-
监视器锁规则:当一个锁解锁后,后面的加锁动作都要可以看到解锁动作,所以happens-before于随后对这个锁的加锁
-
volatile变量规则:volatile实现了变量的线程可见性,所以对这个变量的操作都要被后续可见,所以happens-before于任意后续对这个volatile域的读
-
传递性:如果B可见A,即A可以happens-before于B,如果此时,C又可见B,即B可以happens-before于C,那么对于A和C,A可以happens-before于C
其实happens-before只是一个规则,抽象了JMM提供的内存可见性而已,也就是不用去认识透彻前面提到过的各种重排序,而happens-before的实现其实也就是JMM禁止了各种重排序
前面我们已经简单了解过重排序
重排序是指:编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段,关键在于是为了优化性能,而且要注意,每个线程都会发生重排序,因为处理器每次执行都只是执行一个线程