Java并发编程之验证volatile的可见性
Java并发编程之验证volatile的可见性
通过系列文章的学习,凯哥已经介绍了volatile的三大特性。1:保证可见性 2:不保证原子性 3:保证顺序。那么怎么来验证可见性呢?本文凯哥将通过代码演示来证明volatile的可见性。
前期准备:
共享变量 number 初始值是0,然后修改后的值为100;
两个线程,分别是:主线程Main以及线程名为A的线程
内部类:
可以看到有个方法将变量值修改成了100;
再来看看:
说明:
变量number不用volatile关键字修饰。主线程在运行后,启动子线程。名字为线程A。然后线程A将变量number的值修改成了100后,主线程对number的进行判断。如果numbr的值等于0的时候,就一直while循环。我们预期下结果:线程A修改完数据之后,输出的是100呢还是0呢?最后运行结束这个是否会输出呢?
我们来看看输出的结果:
编辑
可以看到控制台输出的结果,线程A更新完变量的值之后在自己内部获取到变量的值是更新后的,但是在主线程的工作缓存去获取后,依然是0.因为主线程依然还在运行着(红色按钮一直红色的),虽然线程A修改了共享变量的值,但是没有人通知主线程你获取的数据需要更新。这说明,在不用volatile修饰的时候,共享变量在线程A和主线程之间是不可见的。
我们再来试试使用volatile修饰共享变量后运行的结果。
使用volatile修饰变量
volatile int number = 0;
再来查看运行结果:
线程A 进入了。准备操作数据
线程A 更新数据完成。更新后的值为:100
==============main====运行结束.主线程Main获取到的值为:100
结论:
我们可以看到,运行结束语句也输出了。并且主线程获取到number的值就是修改后的100.
这次操作和上次操作唯一区别就是变量number添加了volatile关键字来修饰,但是主线程竟然能够获取到线程A修改后的数据,从而证明了volatile能够保证共享变量在其他线程的可见性。
Volatile第二个特性:不保证原子性的证明,欢迎继续学习凯哥【凯哥Java:kaigejava】下一篇文章《Java并发编程之验证volatile不能保证原子性》。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java并发编程学习前期知识下篇
Java并发编程学习前期知识下篇 通过上一篇《Java并发编程学习前期知识上篇》我们知道了在Java并发中的可见性是什么?volatile的定义以及JMM的定义。我们先来看看几个大厂真实的面试题: 编辑 编辑 编辑 从上面几个真实的面试问题来看,我们可以看到大厂的面试都会问到并发相关的问题。所以 Java并发,这个无论是面试还是在工作中,并发都是会遇到的。Java并发包JUC(java.util.concurrent)有了解过哪些?并发包实现最重要的是什么?其原理是什么知道吗?何为JMM的可见性?volatiile关键字是怎么实现变量可见性的?如果想要学好并发,弄懂理解透彻的话,凯哥觉得以下计算机的知识还是要了解了解。本次《Java并发编程-前期准备知识》凯哥准备用两篇来介绍,主要包括以下内容:简单介绍内存之间可见性是什么?volatile关键字在Java语言规范中是怎么定义的?知道JVM但是你知道JMM是什么吗?计算机中CPU是怎么处理数据的?通过CPU处理数据来深刻理解线程之间可见性。还有就是volatile是怎么保证可见性的呢?其实现的两条原理是什么? CPU相关知识 先来看看凯...
- 下一篇
hetao 更新至 v0.15.0,支持搭载应用的国产原创 Web 服务器
0.15.0 2020-03-14 calvin 新增支持socgi,可以嵌入服务端应用逻辑了 新增支持socgi的rest层,支持开发RESTful风格的应用了 调整了目录文件架构,Dockerfile有待改写 ------------------------------------------------------------------------------ 2. 概述 hetao是一款国人原创研发的开源的C语言实现的支持高并发、超高性能Web服务器,使用高性能HTTP解析器fasterhttp作为其解析核心,在开启Keep-Alive和gzip压缩(现代浏览器默认开启)时性能比nginx约快3倍。如此高性能得益于轻巧的架构设计和采用Inotify文件变化主动通知缓存机制,把大量静态文件尽可能缓存在内存直接读取,比传统的轮询式检查文件机制避免了大量存储IO。 hetao的设计理念是快速、稳定和完整。没有完全采用apache或nginx纯模块化架构,因为大多数人使用webserver一般都会把所有模块都打上,除了动态内容模块(如mod_php),很少见到有人特意去组装模块,那还...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker快速安装Oracle11G,搭建oracle11g学习环境