指令重排
Happen-Before先行发生规则
如果光靠sychronized和volatile来保证程序执行过程中的原子性, 有序性, 可见性, 那么代码将会变得异常繁琐.
JMM提供了Happen-Before规则来约束数据之间是否存在竞争, 线程环境是否安全, 具体如下:
顺序原则
一个线程内保证语义的串行性; a = 1; b = a + 1;
volatile规则
volatile变量的写,先发生于读,这保证了volatile变量的可见性,
锁规则
解锁(unlock)必然发生在随后的加锁(lock)前.
传递性
A先于B,B先于C,那么A必然先于C.
线程启动, 中断, 终止
线程的start()方法先于它的每一个动作.
线程的中断(interrupt())先于被中断线程的代码.
线程的所有操作先于线程的终结(Thread.join()).
对象终结
对象的构造函数执行结束先于finalize()方法