volatile关键字的两层语义
一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:
1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
2)禁止进行指令重排序。
根据volatile的语义,我们可以看到,volatile主要针对的是并发三要素(原子性,可见性和有序性)中的后两者有实际优化作用。
可见性:
线程本身并不直接与主内存进行数据的交互,而是通过线程的工作内存来完成相应的操作。这也是导致线程间数据不可见的本质原因。因此要实现volatile变量的可见性,直接从这方面入手即可。对volatile变量的写操作与普通变量的主要区别有两点:

(1)修改volatile变量时会强制将修改后的值刷新的主内存中。
(2)修改volatile变量后会导致其他线程工作内存中对应的变量值失效。因此,再读取该变量值的时候就需要重新从读取主内存中的值。
通过这两个操作,就可以解决volatile变量的可见性问题。
有序性:
volatile会触发jvm的内存屏障策略
内存屏障策略:
(1)LoadLoad 屏障
执行顺序:Load1—>Loadload—>Load2
确保Load2及后续Load指令加载数据之前能访问到Load1加载的数据。

(2)StoreStore 屏障
执行顺序:Store1—>StoreStore—>Store2
确保Store2以及后续Store指令执行前,Store1操作的数据对其它处理器可见。

(3)LoadStore 屏障
执行顺序: Load1—>LoadStore—>Store2
确保Store2和后续Store指令执行前,可以访问到Load1加载的数据。

(4)StoreLoad 屏障
执行顺序: Store1—> StoreLoad—>Load2
每次对volatile进行读写操作,根据上述表格,会触发对应的CPU指令,从线程内存缓冲区将之前更改的变量刷入主存。
简单来说,volatile会在一定程度上影响jvm指令集的优化策略,在volatile之前和之后的指令集不会乱序越过volatile变量执行。暂时volatile之前和之后的指令集在没有关联性的前提下,jvm可以乱序执行。
jvm的volatile策略,在一定程度上,打折扣地实现了jvm的happens-before原则(先行发生原则),如下所述。
  • 程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作
  • 锁定规则:一个unLock操作先行发生于后面对同一个锁额lock操作
  • volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作
  • 传递规则:如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C
  • 线程启动规则:Thread对象的start()方法先行发生于此线程的每个一个动作
  • 线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生
  • 线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行
  • 对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始

volatile常见使用场景:

(1)状态标记量

(2)单例模式一次性安全发布

(3)低开销读写锁

参考文档:
《Java并发编程:Volatile关键字解析》http://www.cnblogs.com/dolphin0520/p/3920373.html
《Java多线程:volatile变量,happens-before关系及内存一致性》http://www.importnew.com/17149.html
《Java并发编程:volatile的使用及其原理》http://www.cnblogs.com/paddix/p/5428507.html
《Java理论与实践:正确使用Volatile变量》https://www.ibm.com/developerworks/cn/java/j-jtp06197.html

转载于:https://www.cnblogs.com/researchboy/p/researchboy.html

Java并发编程 Volatile关键字解析相关推荐

  1. Java并发编程--volatile关键字解析

    volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以 ...

  2. null在java存在的意义何在,Java并发编程——volatile关键字

    一.volatile是什么 volatile是Java并发编程中重要的一个关键字,被比喻为"轻量级的synchronized",与synchronized不同的是,volatile ...

  3. Java并发编程—volatile关键字(保证变量的可见性、有序性机制)

    原文作者:Matrix海子 原文地址:Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程 ...

  4. Java并发编程-volatile关键字介绍

    前言 要学习好Java的多线程,就一定得对volatile关键字的作用机制了熟于胸.最近博主看了大量关于volatile的相关博客,对其有了一点初步的理解和认识,下面通过自己的话叙述整理一遍. 有什么 ...

  5. Java并发编程-Volatile和Syncronized关键字

    Java并发编程学习分享的目标 了解Java并发编程中常用的工具和类用途与用法 了解Java并发编程工具的实现原理与设计思路 了解并发编程中遇到的常见问题与解决方案 了解如何根据实际情景选择更合适的工 ...

  6. Java并发编程——volatile

    引 volatile可以看成是轻量级的低配版的Synchronized,他主要是作用于共享变量,保证共享变量的可见性.确保共享变量在主内存中一致地准确的更新通知到各个线程,这是Volatile的可见性 ...

  7. 并发编程—Volatile关键字

    锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility).互斥即一次只允许一个线程持有某个特定的锁,因此可以保证一次就只有一个线程在访问共享数据.可见性要复杂一 ...

  8. java并发编程-volatile内存实现和原理

    2019独角兽企业重金招聘Python工程师标准>>> 前面的博文说了java的内存模型,介绍了java内存模型的基础,此篇文章来说一下volatile关键字,这个在并发编程中,占有 ...

  9. Java 并发编程—Synchronized关键字

    原文作者:liuxiaopeng 原文地址:Java并发编程:Synchronized及其实现原理 目录 一.Synchronized的基本使用 二.Synchronized 原理 三.运行结果解释 ...

最新文章

  1. 洛谷——P2626 斐波那契数列(升级版)矩阵
  2. 如何在TEASOFT中加入直线与曲线?
  3. ProxySQL Cluster 概述
  4. 区块链BaaS云服务(21)腾讯CCGP ”跨链协议 AMDP“
  5. 判断文件是否损坏_称重传感器好坏的判断方法,看完秒懂!
  6. ucosii中消息队列、消息邮箱、信号量的区别
  7. 多伦多大学计算机专音乐专业,多伦多大学音乐专业有哪些申请要求?
  8. Codeforces 964B(贪心)
  9. Tensorflow基于mnist数据集实现AlexNet
  10. React.js和Vue.js有感—前端开发组件化思想的局部要点理解
  11. ubuntu下安装flash插件解决视频播放功能
  12. CardView的基本使用、DrawerLayout 滑动菜单、Fragment
  13. macOS CLion 上搭建 GLFW + GLAD OpenGL开发环境
  14. Pyhton爬虫实战 - 抓取BOSS直聘职位描述 和 数据清洗
  15. 在iOS 14中使用带有SF Symbols 2的彩色图标
  16. 日语中di,ti,du,这些如何用片假名打出来
  17. 王健林身价暴跌百亿,儿子却在撒钱!
  18. 【C语言】利用for循环来创建一个金字塔
  19. 深度学习-使用tensorflow实现猫狗识别
  20. 阿里巴巴牵头发起对雅虎的250亿美元并购

热门文章

  1. 8086CPU写汇编的规则
  2. [BUUCTF-pwn]——wustctf2020_name_your_dog
  3. html5圆圈图标,html5移动端环形图标菜单代码
  4. css宋体代码_前端开发必备的CSS命名规范与常用CSS代码集合
  5. 美丽的窗花java分形_美丽的窗花教案
  6. Http协议中的方法
  7. Oracle数据库的数据统计(Analyze)
  8. Cocoa/iPhone App/静态库 嵌入资源文件 rtb v0.1发布
  9. chmod 755 是李鬼(转)
  10. bugku-杂项 听首音乐