点击领取优惠~
430 字
2 分钟
volatile 实现原理了解吗?
volatile 实现原理了解吗?
volatile 有两个作用,保证可见性和有序性。
volatile 怎么保证可见性的呢?
相比 synchronized 的加锁方式来解决共享变量的内存可见性问题,volatile 就是更轻量的选择,它没有上下文切换的额外开销成本。
volatile 可以确保对某个变量的更新对其他线程马上可见,一个变量被声明为 volatile 时,线程在写入变量时不会把值缓存在寄存器或者其他地方,而是会把值刷新回主内存 当其它线程读取该共享变量 ,会从主内存重新获取最新值,而不是使用当前线程的本地内存中的值。
例如,我们声明一个 volatile 变量 volatile int x = 0,线程 A 修改 x=1,修改完之后就会把新的值刷新回主内存,线程 B 读取 x 的时候,就会清空本地内存变量,然后再从主内存获取最新值。
volatile 怎么保证有序性的呢?
重排序可以分为编译器重排序和处理器重排序,valatile 保证有序性,就是通过分别限制这两种类型的重排序。
为了实现 volatile 的内存语义,编译器在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。
- 在每个 volatile 写操作的前面插入一个StoreStore屏障
- 在每个 volatile 写操作的后面插入一个StoreLoad屏障
- 在每个 volatile 读操作的后面插入一个LoadLoad屏障
- 在每个 volatile 读操作的后面插入一个LoadStore屏障
volatile 实现原理了解吗?