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. python3 安装pymssql失败 pip3 install pymssql

    python3 安装pymssql失败 报错信息: AttributeError: module 'platform' has no attribute 'linux_distribution' 解决 ...

  2. TokenObtainPairSerialize和TokenObtainPairView

    TokenObtainPairSerializer和TokenObtainPairView是Django REST framework的SimpleJWT库提供的两个相关的类. TokenObtain ...

  3. [oeasy]教您玩转linux0001 - 先跑起来 🥊

    Python 什么是 Python? Python 很好用 适合初学者 而且在各个领域都很强大   ​   添加图片注释,不超过 140 字(可选)   后来居上 下图可以点开   ​   添加图片注 ...

  4. Odoo 基于Win10搭建基于Win10搭建odoo14开发环境搭建

    实践环境 win10 Python 3.6.2 odoo_14.0.latest.tar.gz 下载地址: https://download.odoocdn.com/download/14/src?p ...

  5. ElementUI 基于vue+sortable.js实现表格行拖拽

    基于vue+sortable.js实现表格行拖拽 By:授客 QQ:1033553122 实践环境 sortablejs@1.13.0 vue@2.6.11 element-ui@2.13.2 安装s ...

  6. Django Template层之自定义tag

    Django Template层之自定义tag by:授客 QQ:1033553122 测试环境 Win7 Django 1.11 实践 步骤1 应用根目录下,新建templatetags包目录(注意 ...

  7. Diffutoon下载介绍:真人视频转动漫工具,轻松获得上千点赞

    最近在刷短视频的时候,偶尔能看到一些真人转动漫风的作品,看起来给人一种新鲜感,流量都还不错,简简单单跳个舞,就能获得上千个点赞~ 那么,这种视频是怎么制作的? 本期给大家介绍一款AI转绘工具Diffu ...

  8. Jmeter察看结果树中文乱码的处理方法

    1.接口执行成功后,在察看结果树返回的Response信息显示中文乱码 2.处理方法: 到jmeter安装目录找到\bin\jmeter.properties文件.右键记事本打开文件定位到这行代码 & ...

  9. 【Project】原生JavaWeb工程 03 单表的业务功能

    年级表效果图样例: 可以看到主要分为以下这些功能: 功能一:展示年级列表 功能二:每个年级都具备修改和删除 功能三:添加一个年级 功能四:对多个年级选中删除,也可以全选删除,或者反选删除 功能五:根据 ...

  10. 【节选 转载】人形机器人Optimus擎天柱技术解析

    参考原文: https://www.sohu.com/a/589454391_383324?scm=9010.8000.0.0.1265 可以利用动作捕捉"学习"人类动作,依靠视觉 ...