volatile与java内存模型

发布时间 2023-06-01 18:40:42作者: 余明星

一、结论

先说结论,volatile能保证可见性和有序性,不能保证原子性。

二、volatile的内存语义

当写一个volatile变量时,会将变量值刷新回主内存

当读一个volatile变更时,会从主内存中读取最新值

三、内存屏障

是什么?

内存屏障是一类同步屏障指令,是cpu或编译器在对内存随机访问操作的一个同步点,使得该点之前的读写操作都执行后才开始执行此点的操作,避免代码重排序。

进一步说明,内存屏障就是一种jvm指令,java内存模型的重排规则要求java编译器在生成jvm指令时插入特定的内存屏障指令,volatile通过内存屏障指令保证了有序性和可见性。

 

内存屏障之前的写操作都刷新会主内存。

内存屏障之后的读操作都会获得内存屏障之前的所有写操作的最新结果。保证了可见性

重排序时,不允许把内存屏障之后的操作重排到内存屏障之前。

 

四、happens-before的volatile变量规则

当第一个操作为volatile读时,不论第二个操作是什么都不允许重排

当第二个操作为volatile写时,不论第一个操作是什么都不允许重排

当第一个操作为volatile写,第二个操作为volatile读时,不允许重排序

 

jmm会在每个volatile写前面插入一个StoreStrore屏障

jmm会在每个volatile写后面插入一个StoreLoad屏障

jmm会在每个volatile读后面插入一个LoadLoad和一个LoadStore屏障