volatile关键字的用法

volatile关键字

什么是可见性?

可见性是指线程A改变变量的值后,线程B可以马上看到更改后变量的值

volatile的作用

关键字volatile提示线程每次从共享内存中读取数据,而不是从私有内存中读取,这样就保证了同步数据的可见性

关键字volatile适用的场景

当想实现一个线程对一个变量进行修改,希望其他线程可以取到最新的值的时候。就需要对变量使用volatile关键字了

我们举一个例子:

import static java.lang.Thread.sleep;

public class VolatileTest {
    public static boolean flag  = true;

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程1 开始!");
                while(flag){

                }
                System.out.println("线程1 结束!");
            }
        });

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程2 开始!");
                flag = false;
                System.out.println("flag = " + flag);
            }
        });

        t1.start();
        sleep(2000);
        t2.start();

    }
}

  • 运行结果
    volatile关键字的用法

我们可以看到:程序在一直运行,进入了死循环,那么是什么原因造成出现了死循环呢?

  • 我么在启动线程t1之后,变量”public static boolean flag = true;”存在于公共堆栈及线程私有的堆栈中,
    t1运行后一直在线程私有堆栈中取得的flag的值是true,而线程2的代码”flag = false;”,修改的是公共堆栈中的
    flag,所以t1线程私有堆栈中的flag仍然是true。

解决方法 -添加volatile关键字

修改”public static volatile boolean flag = true;”,我们再次运行程序

volatile关键字的用法

volatile是否具有原子性?

关键字volatile最大的缺点是不支持原子性,如果修改实例中的数据,比如i++,这样的操作不是原子操作,分为三步

  • 从内存中取i的值
  • 计算i的值
  • 将i的值存入内存中

如果在第二步计算i的值时,其他线程读取i的值,并对i进行修改,这个时候就会出现脏数据,解决方法是使用synchronized关键字

  • 参考资料《Java多线程编程核心技术 第二版》

Original: https://www.cnblogs.com/classicltl/p/16224918.html
Author: classic123
Title: volatile关键字的用法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/711667/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • enum class 、enum struct 和 enum

    至从C语言开始enum类型就被作为用户自定义分类有限集合常量的方法被引入到了语言当中,而且一度成为C++中定义编译期常量的唯一方法(后来在类中引入了静态整型常量)。根据上面对enu…

    技术杂谈 2023年5月31日
    081
  • mstar 平台I2C 配置

    芯片的pin 脚可以用作不同的功能,总结一句就是外设进行状态和数据交换。 最常用的是作为GPIO,设置为输出模式时,通过高低电平来控制一些外围设置;// 如LED,屏的电源,背光的…

    技术杂谈 2023年5月31日
    0106
  • MVCC多版本并发控制的理解

    前置知识 当前读与快照读 当前读什么是当前读:读取的是 最新的数据,不会读到老数据。 何时&…

    技术杂谈 2023年7月24日
    076
  • Promise.all、race和any方法都是什么意思?

    这篇文章发布于 2021年05月9日,星期日,22:51,归类于 JS API。 阅读 11154 次, 今日 1 次 9 条评论 by zhangxinxu from https…

    技术杂谈 2023年6月1日
    083
  • 基于TCP/IP协议,定义原始的字节流协议传输Student类

    在分布式系统中,不同节点之间需要进行通信来实现一致性,例如:在投票选举阶段,候选者需要为所有其他节点发送拉票请求,拉票请求中包含着自己的网络地址和任期号,也就是说,我们需要发送一个…

    技术杂谈 2023年7月23日
    074
  • 理解Compressed Sparse Column Format (CSC)

    最近在看《Spark for Data Science》这本书,阅读到《Machine Learning》这一节的时候被稀疏矩阵的存储格式CSC给弄的晕头转向的。所以专门写一篇文章…

    技术杂谈 2023年6月1日
    092
  • 【赵渝强老师】HBase的体系架构

    一、什么是HBase? HBase是一个基于HDFS之上的分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文”BigTable大表…

    技术杂谈 2023年7月24日
    078
  • Java后端开发——美团(牛客)

    Java的基本数据类型,各自的字节数 ​ 老生常谈,不多说了. 类型 字节数 byte 1字节 short 2字节 int 4字节 long 8字节 float 4字节 doubl…

    技术杂谈 2023年7月11日
    074
  • axios的兼容性问题

    1、axios在PC端浏览器的兼容性问题 axios支持IE8+,但原理是基于promise之上实现的,因此会存在不兼容IE的问题。 trident内核的浏览器下会报:vuex r…

    技术杂谈 2023年5月31日
    080
  • 技术解码 | RSFEC原理分析

    今天向大家介绍下RSFEC的原理,它通过生成冗余数据来恢复丢失的信息,首先介绍下背景,之后重点介绍RSFEC如何计算冗余和恢复数据的,分为异或方式和矩阵方式,异或方式可以认为是矩阵…

    技术杂谈 2023年5月31日
    088
  • git hook 共享

    https://stackoverflow.com/questions/427207/can-git-hook-scripts-be-managed-along-with-the-…

    技术杂谈 2023年7月11日
    0113
  • pdf文件 a4转到手机

    pdf文件 a4转到手机 pdf文件 a4转到手机 pdf文件 a4转到手机 人工智能演示 ……. 计算….. Original: https:…

    技术杂谈 2023年5月31日
    087
  • 实战篇:断点续传?文件秒传?手撸大文件上传

    各位看官大家好,今天给大家分享的又是一篇实战文章,希望大家能够喜欢。 开味菜 最近接到一个新的需求,需要上传 2G左右的视频文件,用测试环境的 OSS试了一下,上传需要十几分钟,再…

    技术杂谈 2023年7月11日
    059
  • 迁移学习

    古语有言:”它山之石可以攻玉”,迁移学习就是这么一种思想,将在其他训练集上训练好的神经网络迁移到目标任务上。自打迁移学习的思想提出后,在工业实践上,就很少有…

    技术杂谈 2023年7月23日
    074
  • Redis

    一、Redis的介绍 什么是Redis Redis是一个开源的使用ANSI C语言编写Key-Value内存数据库 读写性能强,支持多种数据类型 把数据存储在内存中的高速缓存 Re…

    技术杂谈 2023年7月11日
    081
  • innosetup安装之前关闭进程

    InnoSetup覆盖安装的时候可能会因为源程序正在运行而安装失败,以下脚本能够关闭原运行进程。 [code]// 安装前检查关闭**进程function InitializeSe…

    技术杂谈 2023年5月31日
    095
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球