volatile基本介绍

volatile可以看成是synchronized的一种轻量级的实现,但volatile并不能完全代替synchronized,volatile有synchronized可见性的特性,但没有synchronized原子性的特性。可见性即用volatile关键字修饰的成员变量表明该变量不存在工作线程的副本,线程每次直接都从主内存中读取,每次读取的都是最新的值,这也就保证了变量对其他线程的可见性。另外,使用volatile还能确保变量不能被重排序,保证了有序性。

volatile只用修饰一个成员变量,如:private volatile balance;

volatile比synchronized编程更容易且开销更小,但具有一点的使用局限性,使用要相当小心,不能当锁使用。volatile不会像synchronized一样阻塞程序,如果是读操作远多于写操作的情况可以建议使用volatile,它会有更好的性能。

volatile使用场景

如果正确使用volatile的话,必须依赖下以下种条件:

1、对变量的写操作不依赖当前变量的值;

2、该变量没有包含在其他变量的不变式中。

第1个条件就说明了volatile不是原子性的操作,不能使用n++类似的计数器,它不是线程安全的。

1、状态的改变

有些场景肯定会有状态的改变,完成一个主线程的停止等。首先我们开启了一个无限循环的主线程,判断变量isStop变量是否为true,如果true的话就退出程序,否则就一直循环,所以这个isStop的值是别的线程改变的。

上面这段程序如果不加volatile的话会一直卡在循环,此时的线程拿到的值永远为false,加了volatile3秒后就输出stop,所以这段程序很好的解释了可见性的特点。

2、读多写少的情况

假设这样一种场景,有N个线程在读取变量的值,只有一个线程写变量的值,这时候就能保证读线程的可见性,又能保证写线程的线程安全问题。

像n++不是原子类的操作,其实可以通过synchronized对写方法锁住,再用volatile修饰变量,这样就保证了读线程对变量的可见性,又保证了变量的原子性。

如果n不加volatile,程序将一直循环,不能输出stop,也就是此时的线程拿到的值永远为0。当然不加volatile,对获取n的方法进行synchronized修饰也是能及时获取最新值的,但是性能会远低于volatile。

volatile关键字解析~高级java必问相关推荐

  1. 946页“JAVA高级架构必问面试精华”,金九银十社招全拿下

    前言 我本科毕业后在老东家干了两年多,老东家算是一家"小公司"(毕竟这年头没有 BAT 或 TMD 的 title 都不好意思报出身),毕业这两年多我也没有在大厂待过,因此找坑的时 ...

  2. Java并发编程 Volatile关键字解析

    volatile关键字的两层语义 一旦一个共享变量(类的成员变量.类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了 ...

  3. Java并发编程:volatile关键字解析(转载)

    转自https://www.cnblogs.com/dolphin0520/p/3920373.html Java并发编程:volatile关键字解析 Java并发编程:volatile关键字解析 v ...

  4. 理解Java并发编程:volatile关键字解析

    文章目录 volatile关键字作用详解 原子/可见/有序 happen-before原则 volatile的作用 volatile的原理 volatile关键字作用详解 讲到Java中的volati ...

  5. 转载:Java并发编程:volatile关键字解析

    看到一篇写的很细致的文章,感谢作者 作者:Matrix海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者Matrix海子和博客园共有,欢 ...

  6. Java实战应用50篇(一)-Java并发编程:volatile关键字解析

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

  7. Java基础——volatile关键字解析

    简介 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内 ...

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

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

  9. Java并发编程:volatile关键字解析

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

最新文章

  1. RDKit | 基于Ward方法对化合物进行分层聚类
  2. int 做除法运算数据丢失【BigDecimal 重现数字】
  3. Jsonplugin+struts2使用说明
  4. zoj 1670 Jewels from Heaven
  5. 冯小刚导演系列公益短片之林心如版
  6. tensorflow中关于vgg16的项目
  7. css animation动画
  8. 分数相同名次排名规则C语言,如何给数据排名(相同分数相同名次)-excel篇
  9. Nutanix企业云助力嘉里大通提升核心竞争力
  10. MyBatis入门(一) -- 简介
  11. 京东抢购机器人_戴森、科沃斯、SKG...超多大牌低价秒杀!京东电器等你来
  12. Markdown语言调整图片居中、大小
  13. 关键词组合工具-自动关键词挖掘组成关键词软件免费
  14. 海康/大华/华为等摄像头或者录像机无法通过GB28181注册到国标平台LiveGBS的问题排查方法...
  15. 计算机相关的俚语,现代俄语计算机俚语的构成方式.pdf
  16. 《东周列国志》第十一回 宋庄公贪赂构兵 郑祭足杀婿逐主
  17. python输出文本框_python如何使用文本框
  18. SDHC (High Capacity SD Memory Card)
  19. 【编译问题】海思3559A编译问题 texi2dvi:命令找不到
  20. 微信小程序----事件绑定

热门文章

  1. Python正则表达式re模块简明笔记
  2. Ubuntu 16.04下Markdown编辑器Haroopad
  3. 19、Java并发性和多线程-嵌套管程锁死
  4. JS获取用户控件中的子控件Id
  5. 第一章:linux管理文件和目录
  6. 找到一篇有关A*算法文章,不错~收藏
  7. Mp4v2封装H264+AAC为MP4
  8. matlab点云配准(总结性)
  9. ACE_Proactor UDP V2.0
  10. c++矩阵作为函数输入变量_现代控制理论线性系统入门(七)输入输出解耦的控制器设计...