什么是指令重排序
JVM为了优化,在条件允许的情况下,对指令进行一定的重新排列,直接运行当前能够立即执行的后续指令,避开获取下一条指令所需数据造成的等待
线程内串行语义,不考虑多线程间的语义
不是所有指令都能重排
指令重排序案例
写后读:写一个变量之后,再读这个位置
例子
int a = 1;
int b = 2;
上面 int b = 2 ;可以重排
int a = 1;
int b = 2;
int c = a + b;
上面 int c = a + b; 不可以重拍
写后写:写一个变量之后,再写这个位置
例子
int a = 1;
int a = 2;
上面 int a = 2; 不能重排
指令重排序基本规则
程序顺序原则
一个线程内包含语义的串行性
volatile规则
volatile变量的写,先发生于读
锁规则
解锁(unlock)必然发生在随后加锁(lock)前
传递性
A先于B,B先于C,那么A先于C
线程的start方法先于它的每一个动作
线程的所有操作先于线程的终结(Thread.join())
线程的终端(interrupe())先于被中断线程的代码
对象的构造函数执行结束先于finalize()方法