Java volatile 内存屏障保证可见性和有序性
Java juc About 1,089 words相关名词
内存屏障:Memory Barrier
写屏障:store fence
读屏障:load fence
保证可见性
写屏障
保证在该屏障之前的代码,对共享变量的改动,都同步到主存中。
即:保证ready
变量同步到主存的同时,在ready
变量上面的代码,也会同步到主存,此处就是同时将num
和ready
同步到主存中。
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;
}
}
Views: 1,923 · Posted: 2021-09-01
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓
Loading...