Java volatile 内存屏障保证可见性和有序性

Java juc 大约 1089 字

相关名词

内存屏障:Memory Barrier

写屏障:store fence

读屏障:load fence

保证可见性

写屏障

保证在该屏障之前的代码,对共享变量的改动,都同步到主存中。

即:保证ready变量同步到主存的同时,在ready变量上面的代码,也会同步到主存,此处就是同时将numready同步到主存中。

public class Test {
    int num = 0;
    volatile boolean ready = false;

    public void method1() {
        num = 2;
        ready = true; // 写屏障
    }
}

读屏障

保证在该屏障之后的代码,对共享变量的读取。加载的是主存中最新的数据。

即:保证ready变量读取到的是主存的最新的数据的同时,也保证了num变量同样读取的最新的数据。

public class Test {
    int num = 0;
    volatile boolean ready = false;

    public void method2() {
        int a;
        if(ready) { // 读屏障
            a = num + num;
        } else {
            a = 1;
        }
    }

}

保证有序性

写屏障

确保指令重排序时,不会将写屏障之前的代码排在写屏障之后。

即:num = 2;不会重排序到ready = true;后面。

public class Test {
    int num = 0;
    volatile boolean ready = false;

    public void method1() {
        num = 2;
        ready = true; // 写屏障
    }
}

写屏障

确保指令重排序时,不会将读屏障之后的代码排在读屏障之前。

即:a = num1;不会被重排序到a = num2;前面。

public class Test {
    int num1 = 0;
    volatile int num2 = 0;

    public void method2() {
        int a = 0;
        a = num2; // 读屏障
        a = num1;
    }

}
阅读 218 · 发布于 2021-09-01

————        END        ————

扫描下方二维码关注公众号和小程序↓↓↓

扫描二维码关注我
昵称:
随便看看 换一批