美文网首页
volatile解决Java指令重排的问题

volatile解决Java指令重排的问题

作者: WizardL | 来源:发表于2019-12-12 16:50 被阅读0次

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

    什么是指令重排呢?

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

    相关文章

      网友评论

          本文标题:volatile解决Java指令重排的问题

          本文链接:https://www.haomeiwen.com/subject/zxptnctx.html