一旦一个并发共享变量(类的成员变量、静态成员变量)被 volatile 关键字修饰就具备了可见性(即一个线程修改了一个变量的值对于另一个线程来说是立即可见的)和有序性(即禁止进行指令重排序),实质是在生成的汇编代码中多了一个 lock 前缀指令。 譬如我们经常会使用标记法中断线程,如下:

这段代码其实大多数时候是可以中断线程1的,但是依然存在一定小概率无法中断线程1,因为每个线程都有自己的工作内存,当线程1运行时会对主存的 stop 变量拷贝一份放置到自己的工作内存使用,当线程2更改了 stop 变量的值后还未来得及写回主存中而接着做其他事情了,此时线程1可能无法立即感知到 stop 变量的改变而无法中断自己造成错误的逻辑,当我们对 stop 变量添加 volatile 修饰符后就不会存在上面的问题了,因为 volatile 会强制线程修改变量的改变立即回写到主存中,当线程2修改 stop 变量值时会导致线程1的工作内存中 stop 缓存失效进而主动去主存中重新读取 stop 值。

volatile 有序性的保证有两层含义,当程序执行到 volatile 变量的读或者写操作时在其前面的操作的更改肯定已经全部进行且结果已经对后面的操作可见,在其后面的操作肯定还没有进行,在进行指令优化时不能将对 volatile 变量访问的语句放在其后面执行,也不能把 volatile 变量后面的语句放到其前面执行。

volatile 常见的使用场景为多线程自定义条件标记变量中断和单例模式的 double check 等。

总结

volatile可以解决“一写多读”的问题,但是不能解决“多写”的场景。volatile可以修饰数组以及集合等,但是只对该引用有效,对其元素无效。vollatile可以保证其可见性,但是不能保证原子性,如多线程下double和long等都不是原子性操作,先读写前32位,再读写后32位,在这种场景可以保证原子性。

我有一个微信公众号,经常会分享一些Java技术相关的干货;如果你喜欢我的分享,可以用微信搜索“Java团长”或者“javatuanzhang”关注。  

Java 里volatile关键字是什么意思啊?如何使用呢?的更多相关文章

  1. 【转】java中volatile关键字的含义

    java中volatile关键字的含义   在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言 ...

  2. 转:java中volatile关键字的含义

    转:java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言 ...

  3. Java中Volatile关键字详解 (转自郑州的文武)

    java中volatile关键字的含义:http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html 一.基本概念 先补充一下概念:J ...

  4. 就是要你懂Java中volatile关键字实现原理

    原文地址http://www.cnblogs.com/xrq730/p/7048693.html,转载请注明出处,谢谢 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是j ...

  5. Java的 volatile关键字的底层实现原理

    我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.concurrent包的核心,没有volatile就没有这么多的并发类给我们使用.本文详细解读一下volat ...

  6. 【转】Java学习---Java中volatile关键字实现原理

    [原文]https://www.toutiao.com/i6592879392400081412/ 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.c ...

  7. Java中volatile关键字实现原理

    原文地址http://www.cnblogs.com/xrq730/p/7048693.html,转载请注明出处,谢谢 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是j ...

  8. Java 多线程 - Volatile关键字

    作者: dreamcatcher-cx 出处: <http://www.cnblogs.com/chengxiao/> 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明 ...

  9. [面试必备]深入理解Java的volatile关键字

    前言 在Java并发编程中,volatile关键字有着至关重要的作用,在面试中也常常会是必备的一个问题.本文将会介绍volatile关键字的作用以及其实现原理. volatile作用 volatile ...

随机推荐

  1. 04 Redis主从同步

    redis主从同步 原理:1. 从服务器向主服务器发送 SYNC 命令.2. 接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下来执行的所有写命令.3 ...

  2. 代码调试console对象的花式玩法

    转自阮一峰http://www.ruanyifeng.com/home.html console.log(),console.info(),console.debug() console.log方法用 ...

  3. jq上滑加载更多

    html 结构 <div id="main"> <ul class="order-list" id="list_box"& ...

  4. QString与QByteArray互相转换的方法

    本文转载自http://blog.csdn.net/daa20/article/details/51674753 // QString转QByteArray方法 //Qt5.3.2 QString s ...

  5. c++ 实时通信系统(c++socket篇)

    在上一篇简单的介绍了TCP/IP协议,在这一篇我们主要介绍socket的具体实现的函数 第一步首先我们套添加上头文件:(#pragma comment(lib, "WS2_32") ...

  6. Kay and Snowflake CodeForces - 686D (树的重心性质)

    After the piece of a devilish mirror hit the Kay's eye, he is no longer interested in the beauty of ...

  7. 【每日一包0001】is-sorted

    github地址:https://github.com/ABCDdouyae... is-sorted 用于判断数组是否被排序了 文档地址:https://www.npmjs.com/package/ ...

  8. 数组转list

    例如String数组转成Integer泛型的List String [] pathArr = deptPath.split(","); Lit<Integer> dep ...

  9. スワコゥのパーフェクトコード教室 ~ Style of suwakow's for OI Codes

    "みんなー! スワコゥのコード教室はじまるよー!" "大家!\(\color{grey}{\text{suwakow}}\)的码风教室开始了哟!" " ...

  10. gulp 自动化构建网站(版本号静态资源)

    前言 新的一年啦,感觉总是静不下心,用了一天的时间吧,算是对gulp 这个前端打包工具入门了,自己也写了demo,表示对这个稍微理解了吧, 当然还是有差距的啦,下面讲讲怎么用吧: 如何用 当然先去官网 ...