volatile关键字解析~高级java必问
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必问相关推荐
- 946页“JAVA高级架构必问面试精华”,金九银十社招全拿下
前言 我本科毕业后在老东家干了两年多,老东家算是一家"小公司"(毕竟这年头没有 BAT 或 TMD 的 title 都不好意思报出身),毕业这两年多我也没有在大厂待过,因此找坑的时 ...
- Java并发编程 Volatile关键字解析
volatile关键字的两层语义 一旦一个共享变量(类的成员变量.类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了 ...
- Java并发编程:volatile关键字解析(转载)
转自https://www.cnblogs.com/dolphin0520/p/3920373.html Java并发编程:volatile关键字解析 Java并发编程:volatile关键字解析 v ...
- 理解Java并发编程:volatile关键字解析
文章目录 volatile关键字作用详解 原子/可见/有序 happen-before原则 volatile的作用 volatile的原理 volatile关键字作用详解 讲到Java中的volati ...
- 转载:Java并发编程:volatile关键字解析
看到一篇写的很细致的文章,感谢作者 作者:Matrix海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者Matrix海子和博客园共有,欢 ...
- Java实战应用50篇(一)-Java并发编程:volatile关键字解析
前言 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字 ...
- Java基础——volatile关键字解析
简介 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内 ...
- Java并发编程--volatile关键字解析
volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以 ...
- Java并发编程:volatile关键字解析
volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字 ...
最新文章
- RDKit | 基于Ward方法对化合物进行分层聚类
- int 做除法运算数据丢失【BigDecimal 重现数字】
- Jsonplugin+struts2使用说明
- zoj 1670 Jewels from Heaven
- 冯小刚导演系列公益短片之林心如版
- tensorflow中关于vgg16的项目
- css animation动画
- 分数相同名次排名规则C语言,如何给数据排名(相同分数相同名次)-excel篇
- Nutanix企业云助力嘉里大通提升核心竞争力
- MyBatis入门(一) -- 简介
- 京东抢购机器人_戴森、科沃斯、SKG...超多大牌低价秒杀!京东电器等你来
- Markdown语言调整图片居中、大小
- 关键词组合工具-自动关键词挖掘组成关键词软件免费
- 海康/大华/华为等摄像头或者录像机无法通过GB28181注册到国标平台LiveGBS的问题排查方法...
- 计算机相关的俚语,现代俄语计算机俚语的构成方式.pdf
- 《东周列国志》第十一回 宋庄公贪赂构兵 郑祭足杀婿逐主
- python输出文本框_python如何使用文本框
- SDHC (High Capacity SD Memory Card)
- 【编译问题】海思3559A编译问题 texi2dvi:命令找不到
- 微信小程序----事件绑定
热门文章
- Python正则表达式re模块简明笔记
- Ubuntu 16.04下Markdown编辑器Haroopad
- 19、Java并发性和多线程-嵌套管程锁死
- JS获取用户控件中的子控件Id
- 第一章:linux管理文件和目录
- 找到一篇有关A*算法文章,不错~收藏
- Mp4v2封装H264+AAC为MP4
- matlab点云配准(总结性)
- ACE_Proactor UDP V2.0
- c++矩阵作为函数输入变量_现代控制理论线性系统入门(七)输入输出解耦的控制器设计...