在java中,关键字volatile那是必须要掌握的,这在多线程并发中大量被使用。从之前的jdk源码也可以知道,volatile和CAS构成了java语言高并发的基石。我们一般会把volatile称为轻量级的锁,有时我们在使用volatile的时候能够达到更高的并发。那么关键字 volatile的作用是什么?我们在实际中如果需要使用volatile的话,无非是保证有序性和可见性。有序性和可见性在之前的 并发的特性中有介绍。那么volatile是怎么实现这两个特性的呢。

可见性

在了解可见性性之前,我们得熟悉几个cpu的指令编码,这样能方便我们快速理解这块的实现(图片源自java并发编程的艺术)。

如果我们对一个变量加上volatile关键字,那么在编译成汇编的时候会加上lock前缀,那么这个lock前缀就是关键能完成这个可见性的操作,具体实现如下:

1)将当前处理器的缓存行数据写回到系统内存

2)这个写回内存的操作会使其他cpu里面缓存的了该内存地址的变为无效

这两个和我们之前讲的内存模型里面是一致的,就是实现写回主存,其他内存地址无效,那么其他地址如果要读取数据的话,就必须要从主存中从新拉取数据。

有序性

指令重排序是java为了提升性能而对指令进行重新排序。指令重排序包括以下几个重排序过程:编译器重排序 --》指令集并行重排序 --》内存系统的重排序。实际上就是从代码到cpu执行的一系列过程,为了优化性能,都进行了相应的指令重排序的操作。但是在单线程的情况下,这些指令的重排序是能够保证执行的结果和实际看到代码的顺序的结果是一样的,但是在多线程的情况下 ,指令重排序就可能导致意外的“惊喜”。

volatile在实现上是通过限制编译器重排序,指令集重排序实现的。Volatile关键字规定了编译器的重排序规则:(图片来自java并发编程的艺术)

从这个表格上我们可以看出以下几点:

1) 第二个操作是volatile写时,第一个操作无论是啥都不能重排序这个操作保证写前和写后的不会顺序错乱,写前的不会在写后操作。

2) 第一个操作是volatile读时,第二个操作无论是啥都不能重排序。这个保证volatile读的顺序,读后的不会到读前面。

3) 第一个操作是volatile写,第二个操作是volatile读时,不能重排序这个保证volatile写在读之前。

Ok,当我们了解了这几条规则之后,我们JMM是怎么实现这些规则的,通过一种叫做内存屏障的保护进行,这个之前在unsafe类中也有提到loadFence,storeFence等类似内存屏障的操作。JMM在使用内存屏障采用的策略如下:

1)在每个volatile写操作的前面插入一个StoreStore屏障,后面插入一个StoreLoad屏障,用来完成对写的保护。

2)在每个volatile读操作的后面插入一个LoadLoad屏障和LoadStore屏障,用来完成对读操作的保护。

下面我们看一个例子:

1. public class Test{

2.     volatile int v1 = 1;

3.     public void testVolatile() {

4.         int i = v1; // 第一个volatile读

5.         v1 = i + 1; // 第一个volatile写

6.         //...

7.     }

8. }

那么编译器生成的字节码将会如下:

上面是编译器处理后的指令,但是有些cpu产商会把这些屏障在进一步优化,但是这个优化实际上是能够保证先后顺序的。

虽然现在当我们了解了volatile的实现原理,但是实际上我们如果想要用volatile替换锁的话,还是要慎重考虑,因为多线程在实际生产中真的有可能 会导致很诡异的情况,这种往往要定位很久。但是如果项目对性能要求不是特别高的话,使用锁是一种比较保险且有效的方法实现多线程的同步的。

想要了解更多java内容(包含大厂面试题和题解)可以关注公众号,也可以在公众号留言,帮忙内推阿里、腾讯等互联网大厂哈

Volatile底层实现原理相关推荐

  1. 并发之volatile底层原理

    15.深入分析Volatile的实现原理 14.java多线程编程底层原理剖析以及volatile原理 13.Java中Volatile底层原理与应用 12.Java多线程-java.util.con ...

  2. HashMap底层实现原理,红黑树,B+树,B树的结构原理,volatile关键字,CAS(比较与交换)实现原理

    HashMap底层实现原理,红黑树,B+树,B树的结构原理,volatile关键字,CAS(比较与交换)实现原理 首先HashMap是Map的一个实现类,而Map存储形式是键值对(key,value) ...

  3. java多线程:9、synchronized、Lock的底层实现原理以及和volatile、Lock、ReentrantLock的区别?

    文章目录 0.1.线程中安全性问题的体现: 0.2.线程安全问题的解决办法 1.synchronized的底层实现原理分析 2.Lock的底层实现原理分析? 3.synchronized和volati ...

  4. 分析Volatile的作用及底层实现原理,面试问一点都不慌!

    文章简介 分析volatile的作用以及底层实现原理,这也是大公司喜欢问的问题 内容导航 volatile的作用 什么是可见性 volatile源码分析 01.volatile的作用 在多线程中,vo ...

  5. Java并发机制底层实现原理-volatile

    章节目录 volatile的实现原理与应用 1.volatile的实现原理与应用 Java source code->Java class->JVM->汇编指令->cpu执行 ...

  6. Java并发机制的底层实现原理

    Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令.本章我们将 ...

  7. 《Java并发编程的艺术》一一第2章Java并发机制的底层实现原理

    第2章Java并发机制的底层实现原理 2.1 volatile的应用 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行, ...

  8. JMM和底层实现原理

    1.并发编程领域的关键问题 1.1 线程之间的通信 线程的通信是指线程之间以何种机制来交换信息.在编程中,线程之间的通信机制有两种,共享内存和消息传递. 在共享内存的并发模型里,线程之间共享程序的公共 ...

  9. Java 并发编程CAS、volatile、synchronized原理详解

    CAS(CompareAndSwap) 什么是CAS? 在Java中调用的是Unsafe的如下方法来CAS修改对象int属性的值(借助C来调用CPU底层指令实现的): /*** * @param o ...

  10. 《Java并发编程的艺术》:第2章 Java并发机制的底层实现原理

    前言 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节 码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和 CPU的指令. ...

最新文章

  1. UVA 11752 超级幂
  2. 大家都来说说为什么要学习jQuery Mboile?
  3. re2c php,PHP的词法解析器:re2c
  4. 软件保障与测试课程实践记录:贪吃蛇小程序
  5. ubuntu 安装 php
  6. java 获取xml 版本号_java解析xml获取对应值
  7. 三星app图标不见了怎么恢复_手机便签的内容不见了怎么恢复?试试这款便签软件的时间轴功能...
  8. 软件需求包括3个不同的层次――业务需求、用户需求和功能需求
  9. PyGame每日一练——五子棋小游戏
  10. 分子动力学模拟gro格式转换为 car
  11. vue 在数组中添加字段
  12. Android SearchView基本用法
  13. 自定义函数使用GridSearchCV参数寻优
  14. 使用层次聚类在结构点云中进行平面的快速提取
  15. CentOS 安装与配置
  16. cmd.exe病毒的清除
  17. 大数据早报:甲骨文公司投资4300万美元在总部建高中 18项全球互联网领先科技成果公布中国占6成 (12.6)
  18. Gartner:2018年十大安全项目详解
  19. 华为H2288Hv2装Linux教程,华为RH2288H V2服务器内部介绍_华为 FusionServer RH2288 V2_服务器评测与技术-中关村在线...
  20. 酷q java_CQ-HTTP-FOR-JAVA

热门文章

  1. Vue知识点囊括清单
  2. LINUX邻居子系统(一)
  3. 基于GoLang实现API短信网关
  4. 修炼程序员的职业水准
  5. 对绝对地址0x100000赋值 让程序跳转到绝对地址是0x100000去执行
  6. Java虚拟机——Parallel Scavenge收集器
  7. mysql中将数字转化成汉字 基础
  8. 使用CCS导出TXT用于BSL烧录
  9. 程序员转行可以做什么?
  10. mac pro 安装双系统与windows下解决右键问题