决定一个人的一生,以及整个命运的,只是一瞬之间。——歌德
什么是指令重排呢?
指令重排是指在程序执行过程中, 为了性能考虑, 编译器和CPU可能会对指令重新排序.
int a = 1;//第一步
int b = a;//第二步
int c = 4;//第三步
这段代码第一步和第二步是不会被重排的。但是,第三步是可能会被重排的。
重排后的代码如下:
int c = 4;
int a = 1;
int b = a;
重排后的代码c的赋值被提前了。但是如果这个时候有另外一个线程用到了a变量的值,但是由于指令重排,导致了a的值没有被优先赋值,这时候,这个线程拿到的值就是0,很有可能就会导致程序出现莫名其妙的问题。
避免指令重排
避免指令重排的方法可以使用volatile关键字,这个关键字会限制编译器和cpu对变量进行指令重排,从而不影响结果。