了解java指令的重排序

java中编写的代码,不一定会顺序执行

例如在三段行看似“无关联”代码。

//假设为静态变量
static int a=0;
static boolean b=false;

//赋值

a=2;
b=true;

// 这是一个看似无关联代码(另一个线程)
if(b){
    System.out.println(a+a);
}

关于a,b的使用,肯定在声明之后,因为有明确的依赖性。

而a,b的再次使用之间则没有明确关联。

假如执行a,b赋值后立刻执行if,那么得到的输出是4

假设执行的是b赋值然后if,那么得到输出0。(正常情况下,b为true就是4)

由此可以看到java指令重排序带来了一些灾难。

如果使用volatile修饰变量,则有以下效果:

1. volatile写之前的操作不会被重排序到volatile写之后。

2. volatile读之后的操作不会被重排序到volatile读之前。

3. 前边是volatile写,后边是volatile读,这两个操作不能重排序。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注