volatile 的实现原理及使用场景

了解volatile

volatile 修饰的使用及实现原理。在java语言规范第三版中对volatile的定义如下:java 编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排它锁单独获得这个变量。

也就是当我们访问共享变量时,为了确保能正确访问所以需要加上排它锁。而java本身提供了volatile,如果某些字段被修饰成了volatile类型的话没那么java线程内存模型将确保所有的线程看到的这个变量的值是一致的。换句话说volatile是轻量级的synchronize。

volatile的可见性原理

理解volatile可见性,首先要知道jmm内存模型。从汇编的角度上来看,被volatile修饰的代码在生成汇编语言的时候会多出一行汇编代码,这行汇编代码带lock前缀。
而在lock前缀指令会发生两件事

  1. 当前缓存行数据写操作时,会触发该缓存行写回系统主内存。
  2. 这个写回内存的操作会使其他缓存了该地址的数据无效。

即这样在底层实现了volatile的可见性。

volatile的防重排

在jvm引入jit之后,jit会优化代码语句重排。但是重排的原理要服从happen-before原则,而volatile修饰的变量会在汇编代码是插入 memory barriers(内存屏障)来防止语句的重排。这样的好处有,当我们对一个变量同时读写的时候,它可以保证写会发生在读的前面。还有就是单例模式的double-check。单例用volatile修饰可以防语句的重排,而导致npe异常。

volatile的使用场景及注意内容

1.volatile经典的使用场景,有ConcurrentHashMap的数据结构都是用volatile来修饰了这也就是同步ConcurrentHashMap的get操作不需要加锁的原因,还有就是long,double。这种基础类型需要用volatile,他们的读、写操作并不是原子的。然后就是单例模式下的double-check模式。
2.使用volatile时应该注意的问题就是,volatile只是保证了单个修饰的变量的可见性,防重排。并不保证原子操作,列如

1
2
3
4
5
6
7
volatile int i = 0;

i = i + 1;



i++;

上述代码中的两种操作都是不符合原子操作的,具体的使用场景可以参考1中的使用场景。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容使用说明 YOLO高分设计资源源码,详情请查看资源内容使用说明 YOLO高分设计资源源码,详情请查看资源内容使用说明 YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值