volatile 的实现原理

本文详细介绍了Java中volatile关键字的作用,包括保证变量可见性和防止指令重排序。volatile通过内存屏障确保了工作内存与主内存的同步,确保每个线程都能获取到最新值。同时,它利用内存屏障阻止特定类型的处理器重排序,以维护程序执行的正确性。了解这些原理对于多线程编程至关重要。
摘要由CSDN通过智能技术生成

目录

volatile的作用

实现原理

如何保证可见性

Java变量的读写

volatile如何保持内存可见性

防止指令重排

参考


volatile的作用

保证变量可见性
防止指令重排序 : 例子:双重校验锁的懒汉式单例模式

实现原理

如何保证可见性

java通过几种原子操作完成工作内存和主内存的交互,volatile规定 load之前必须read,这样保证每次读的时候会从主存中读取。

Java变量的读写

Java通过几种原子操作完成工作内存主内存的交互:

  1. lock:作用于主内存,把变量标识为线程独占状态。
  2. unlock:作用于主内存,解除独占状态。
  3. read:作用主内存,把一个变量的值从主内存传输到线程的工作内存。
  4. load:作用于工作内存,把read操作传过来的变量值放入工作内存的变量副本中。
  5. use:作用工作内存,把工作内存当中的一个变量值传给执行引擎。
  6. assign:作用工作内存,把一个从执行引擎接收到的值赋值给工作内存的变量。
  7. store:作用于工作内存的变量,把工作内存的一个变量的值传送到主内存中。
  8. write:作用于主内存的变量,把store操作传来的变量的值放入主内存的变量中。

volatile如何保持内存可见性

volatile的特殊规则就是:

  • read、load、use动作必须连续出现
  • assign、store、write动作必须连续出现

所以,使用volatile变量能够保证:

  • 每次读取前必须先从主内存刷新最新的值。
  • 每次写入后必须立即同步回主内存当中。

 

也就是说,volatile关键字修饰的变量看到的随时是自己的最新值。线程1中对变量v的最新修改,对线程2是可见的。

防止指令重排

编译器在生成字节码时,会在指令序列中插入 内存屏障来禁止特定类型的处理器重排序。
volatile 的底层实现原理是内存屏障, Memory Barrier
volatile 变量的写指令后会加入写屏障
volatile 变量的读指令前会加入读屏障
内存屏障之前的所有写操作都要写入内存;内存屏障之后的读操作都可以获得同步屏障之前的写操作的结果。

 

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

trigger333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值