volatile关键字作用及原理

volatile的作用

volatile的两层语义:

1、volatile保证变量对所有线程的可见性:当volatile变量被修改,新值对所有线程会立即更新。或者理解为多线程环境下使用volatile修饰的变量的值一定是最新的。

2、jdk1.5以后volatile完全避免了指令重排优化。


volatile使用场景

volatile可以部分取代synchronized,作为一个轻量级的读安全锁,但是并非写入安全。

使用volatile必须满足:

1、运算结果不依赖当前值,或者说确保只有单一线程能修改volatile的值。

例如多线程对某个变量自增操作,会导致实际上很多自增作废无法写入。

2、变量不需要与其他的状态变量共同参与不变约束。

volatile的底层实现原理是什么?

获取JIT(即时Java编译器,把字节码解释为机器语言发送给处理器)的汇编代码,发现volatile多加了lock addl指令,这个操作相当于一个内存屏障,使得lock指令后的指令不能重排序到内存屏障前的位置。这也是为什么JDK1.5以后可以使用双锁检测实现单例模式。

lock前缀的另一层意义是使得本线程工作内存中的volatile变量值立即写入到主内存中,并且使得其他线程共享的该volatile变量无效化,这样其他线程必须重新从主内存中读取变量值。

关于处理器指令重排

指令重排序是JVM为了优化指令,提高程序运行效率。指令重排序包括编译器重排序和运行时重排序。JVM规范规定,指令重排序可以在不影响单线程程序执行结果前提下进行。

关于DCL双锁检测

在JDK1.5前使用volatile,或者不使用volatile修饰单例,会导致引用返回后对象并未初始化完毕就释放了锁,而jdk1.5后加入volatile即加入了内存屏障,对象的初始化必须完成后才能给变量赋值。这样就不存在指令重排优化后的缺陷。

volatile的性能

读操作与普通变量无差别,写操作会慢一些,大多情况比锁消耗低。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,473评论 11 349
  • 此文章出自:<a href="http://www.cnblogs.com/dolphin0520/p/39203...
    zlb阅读 3,826评论 0 6
  • 作为一名工科女,毕业似乎就意味着失业,考研成为了为数不多的选择中的最优选项。每天在图书馆过着不见天日的生活,甚至连...
    复明的瞎子阅读 2,425评论 0 2
  • 手机型号:iPhone 5s 体统版本:ISO 10.2.1 体验版本:V1.1.2 体验时间:2017年6月22...
    末末ss阅读 3,258评论 0 0
  • 业余时间,我喜欢到网上的论坛看看,或发帖,或跟帖,每次都能见景生情触发灵感。论坛的帖子体裁多样,内容广泛,不仅有文...
    叶笑风阅读 3,177评论 0 3