Java教程

指令重排

本文主要是介绍指令重排,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

指令重排

  • 什么是 指令重排:

    你写的程序,计算机并不是按照你写的那样去执行的。

    源代码—>编译器优化的重排—> 指令并行也可能会重排—> 内存系统也会重排—-> 执行
    处理器在进行指令重排的时候,考虑:数据之间的依赖性!

int x = 1; // 1 
int y = 2; // 2 
x = x + 5; // 3
 y = x * x; // 4
我们所期望的:1234  但是可能执行的时候回变成 2134  1324 
可不可能是  4123

可能造成影响的结果: a b x y 这四个值默认都是 0;

线程A 线程B
x=a y=b
b=1 a=2

正常的结果: x = 0;y = 0;但是可能由于指令重排

线程A 线程B
b=1 a=2
x=a y=b

指令重排导致的诡异结果: x = 2;y = 1;

  • volatile可以避免指令重排:

    内存屏障。CPU指令。作用:
    1、保证特定的操作的执行顺序!
    2、可以保证某些变量的内存可见性 (利用这些特性volatile实现了可见性)

在这里插入图片描述

Volatile 是可以保持 可见性。不能保证原子性,由于内存屏障,可以保证避免指令重排的现象产生
可见性:产生在单例模式中的饿汉模式DCL

这篇关于指令重排的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!