volatile解决Java指令重排的问题

2019-12-12  本文已影响0人  WizardL

浪费时间是一桩大罪过。——卢梭

什么是指令重排呢?

指令重排是指在程序执行过程中, 为了性能考虑, 编译器和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对变量进行指令重排,从而不影响结果。

上一篇 下一篇

猜你喜欢

热点阅读