你好,先说happens-before:
程序次序原则: 在一个线程内,代码按照顺序执行
管程锁定规则: 在同一个monitor上,unlock操作时间上先行发生于后面的lock操作
volatile变量规则: 对一个volatile变量的写操作先于读操作
线程启动原则: Thread的start()先于该线程的任何操作
线程终止原则: Thread的所有操作都先于线程的终止检测。可以通过Thread.join()和Thread.isAlive()的返回值检测线程是否已终止
线程终断规则: 线程的interrupt()方法先于中断线程检测到中断事件的发生,即可以使用interrupted()方法检测到线程是否被中断了。
对象终结原则: 对象构造函数执行完毕先于finilized()方法
传递性: A先于B,B先于C。可以推断出A先于C