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不能保证原子性》。

Java并发编程之验证volatile的可见性的更多相关文章

  1. Java并发编程之验证volatile不能保证原子性

    Java并发编程之验证volatile不能保证原子性 通过系列文章的学习,凯哥已经介绍了volatile的三大特性.1:保证可见性 2:不保证原子性 3:保证顺序.那么怎么来验证可见性呢?本文凯哥(凯 ...

  2. Java并发编程之三:volatile关键字解析 转载

    目录: <Java并发编程之三:volatile关键字解析 转载> <Synchronized之一:基本使用>   volatile这个关键字可能很多朋友都听说过,或许也都用过 ...

  3. Java并发编程基础之volatile

    首先简单介绍一下volatile的应用,volatile作为Java多线程中轻量级的同步措施,保证了多线程环境中“共享变量”的可见性.这里的可见性简单而言可以理解为当一个线程修改了一个共享变量的时候, ...

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

    转载:https://www.cnblogs.com/dolphin0520/p/3920373.html 写的非常棒,好东西要分享一下 Java并发编程:volatile关键字解析 volatile ...

  5. 干货:Java并发编程系列之volatile(二)

    接上一篇<Java并发编程系列之synchronized(一)>,这是第二篇,说的是关于并发编程的volatile元素. Java语言规范第三版中对volatile的定义如下:Java编程 ...

  6. Java并发编程知识点总结Volatile、Synchronized、Lock实现原理

    Volatile关键字及其实现原理 在多线程并发编程中,Volatile可以理解为轻量级的Synchronized,用volatile关键字声明的变量,叫做共享变量,其保证了变量的“可见性”以及“有序 ...

  7. Java并发编程实战 02Java如何解决可见性和有序性问题

    摘要 在上一篇文章当中,讲到了CPU缓存导致可见性.线程切换导致了原子性.编译优化导致了有序性问题.那么这篇文章就先解决其中的可见性和有序性问题,引出了今天的主角:Java内存模型(面试并发的时候会经 ...

  8. Java并发编程里的volatile。Java内存模型核CPU内存架构的对应关系

    CPU内存架构:https://www.jianshu.com/p/3d1eb589b48e Java内存模型:https://www.jianshu.com/p/27a9003c33f4 多线程下的 ...

  9. java并发编程实战《一》可见性、原子性和有序性

    可见性.原子性和有序性问题:并发编程Bug的源头 核心矛盾:CPU.IO.内存三者之间的速度差异. 为了合理利用 CPU 的高性能,平衡这三者的速度差异,计算机体系结构.操作系统.编译程序都做出了贡献 ...

  10. 【Java并发编程】:volatile变量修饰符

    volatile用处说明     在JDK1.2之前,java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的.而随着JVM的成熟和优化,现在在多线程环境下volatile关键 ...

随机推荐

  1. 对于三节点集群zookeeper配置步骤:

    步骤一:干净的集群,全新的hdfs在第一台主机上配置配置文件core-site.xml:<configuration><property> <name>fs.def ...

  2. 在SelfHost项目中获取客户端IP地址

    在SelfHost项目中,获取客户端的IP地址比OwinSelfHost项目要复杂一些,可以通过以下方法获得: base.Request.Properties["System.Service ...

  3. Spark大数据集群日常开发过程遇到的异常及解决思路汇总

    总结/朱季谦 一.出现java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.()V ...

  4. 防火防盗防CDN流量盗刷

    没想到自己的小破站也逃不掉被攻击的命,分分钟就给我刷欠费了. 本来不想写这篇文章的,但看到好多大佬(小林coding. JavaGuide)近期cdn都被盗刷了. 还是来提醒下大家,防火防盗防cdn流 ...

  5. 洛谷P1832

    #include<iostream> #include<utility> using namespace std; typedef long long ll; #define ...

  6. 3 - 【RocketMQ 系列】CentOS 7.6 安装部署RocketMQ

    四.安装管理面板 1.介质下载 下载到本地再上传,下载地址:https://github.com/apache/rocketmq-dashboard/archive/refs/tags/rocketm ...

  7. [oeasy]python0144_try的完全体_否则_else_最终_finally

    try的完全体 回忆上次内容   上次细化了主控程序(main.py) 导入(get_fruits.py) 处理(process.py) 输出(output.py)   使用了 try 结构 try ...

  8. OpenStack 基本命令

    keystone source /etc/keystone/admin-openrc.sh #登录 openstack user create --password ps1234 --email hq ...

  9. onnxruntime无法使用GPU加速 加速失败 解决方法【非常详细】

    onnx 无法使用GPU加速 加速失败 解决方法[非常详细] 应该是自目前以来最详细的加速失败解决方法GPU加速,收集了各方的资料.引用资料见后文 硬件配置: GPU CUDA版本:12.2 客户架构 ...

  10. 【微信小程序】 使用NPM包与VantWeapp

    小程序对npm的支持与限制 目前,小程序中已经支持使用npm安装第三方包,从而来提高小程序的开发效率. 但是,在小程序中使用npm包有如下3个限制: ① 不支持依赖于Node.js内置库的包② 不支持 ...