Volatile关键字的作用

news2025/1/10 23:47:49

专栏链接:多线程相关知识详解

编译器有优化功能,会对写好的代码进行优化,在多线程里面可能就会对代码的执行逻辑进行修改,就可能会产生bug

例如下面这个代码:

import java.util.Scanner;

class Counter{
    public static int count = 0;
}

public class Demo {
    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {//用lambda创建线程
            while(Counter.count == 0){
                
            }
            System.out.println("t1执行结束");
        });
        t1.start();

        Thread t2 = new Thread(() -> {
            System.out.println("请输入一个整数:");
            Scanner scanner = new Scanner(System.in);
            Counter.count = scanner.nextInt();
        });
        t2.start();

    }
}

运行结果:

程序并不会因为count的值的改变而终止线程

因为执行该操作的时候需要将内存里面的数据读取到CPU寄存器中,而寄存器和内存之间的访问速度相差3到4个数量级,而反复的从内存中读取数据的话就会导致程序的运行效率降低,所以编译器优化成第一次读取内存中的数据,然后保存在寄存器的缓存中,需要的时候再从缓存中读取数据,运行效率就会大幅度提高,但是运行结果正确比运行速度快更重要,因为数据都错了运行得再快也没用,所以该处应该要阻止编译器的优化

Ⅰ.调用Thread中的sleep方法

调用Thread中的sleep方法,让其进行休眠,下面用sleep使其休眠1秒,在没休眠的时候1秒内程序能够运行非常多次,对于程序的优化的需要就比较迫切,现在1秒只能运行一次,优不优化就不那么重要,1秒读取一次内存对于CPU来说轻而易举,所以每次就能从内存中读取到准确的数据

import java.util.Scanner;

class Counter{
    public static int count = 0;
}

public class Demo {
    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            while(Counter.count == 0){
                try {
                    Thread.sleep(1000);//休眠1秒
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            System.out.println("t1执行结束");
        });
        t1.start();

        Thread t2 = new Thread(() -> {
            System.out.println("请输入一个整数:");
            Scanner scanner = new Scanner(System.in);
            Counter.count = scanner.nextInt();
        });
        t2.start();

    }
}

运行结果:

Ⅱ.使用volatile

volatile用来修饰成员变量,能够在读取该数据的时候从内存中读取不是从寄存器中读取,这就保证了数据的准确性

import java.util.Scanner;

class Counter{
    public volatile static int count = 0;
}

public class Demo2 {

    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            while(Counter.count == 0){
                
            }
            System.out.println("t1执行结束");
        });
        t1.start();

        Thread t2 = new Thread(() -> {
            System.out.println("请输入一个整数:");
            Scanner scanner = new Scanner(System.in);
            Counter.count = scanner.nextInt();
        });
        t2.start();
    }
}

运行结果:

volatile的两个作用:

保证内存可见性问题.当一个线程进行修改同一个变量的时候,另一个线程能够及时的读取到改变量的值

禁止指令重排序.编译时JVM编译器遵守内存屏障的限制,运行时靠屏障指令组织指令顺序

volatile与synchronized不一样,volatile并不保证原子性 

volatile避免了直接读取CPU寄存器(工作内存)中缓存的数据,而是每次重新读取内存(主内存)

此次的工作内存不是真的内存,主内存才是真的内存

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/76663.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RK3568平台开发系列讲解(系统优化篇)系统卡顿了怎么办

🚀返回专栏总目录 文章目录 一、卡顿问题分析指标二、Android 卡顿排查工具沉淀、分享、成长,让自己和他人都能有所收获!😄 📢对用户来说,内存占用高、耗费电量、耗费流量可能不容易被发现,但是用户对卡顿特别敏感,很容易直观感受到。另一方面,对于开发者来说,卡顿…

windows vs2019 编译glib2

1、安装meson pip install meson 确认是否安装成功,命令行输入: meson --version 0.60.0 2,安装ninja 先下载ninja:Releases ninja-build/ninja GitHub 加压后,把ninja.exe所在目录加入环境变量 确认是否安装成功&#xf…

英文外链怎么做效果好?

google英文外链怎么做效果好? 答案是:建设GPB外链 正确的外链建设行为追求的是高质量的外链。 对于高质量外链的定义:优质的外链是来自搜索引擎和搜索者都信任的权威网站,网站越值得信赖、越权威,链接质量就越好 网…

【ElementUI】树形控件 el-tree

目录 公共参数 基础用法 最后一层不可选择 思路一:第三层设置disable 思路二:利用样式隐藏掉第三层的选框 最后一层展示复选框 转载请注明:宾果的救星的博客_CSDN博客 公共参数 treeContent:[{name: 1,id: 1,level: 1,children: [{na…

HPPH偶联金属/小分子抑制剂/上转换纳米颗粒/点击化学/核壳磁性纳米粒子的方法

小编这里分享了科研内容HPPH偶联金属/小分子抑制剂/上转换纳米颗粒/点击化学/核壳磁性纳米粒子的方法,来看! 点击输入图片描述(最多30字) 制备光敏剂HPPH的方法: (1) 叶绿素-a的提取;(2)脱镁叶绿酸-a甲酯的制备;(3)焦…

ADI Blackfin DSP处理器-BF533的开发详解20:4.3寸LCD液晶屏的设计与应用(含源码)

硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 ADSP-EDU-BF53x 开发板上的液晶屏为 480*272 尺寸真彩 TFT 液晶屏,其型号为 WXCAT43-TG3#001R。 WXCAT43-TG3#001R 为 24B…

C#开发如何加载64位版本易景地球 EviaEarth的三维控件

易景地球6.1.x后续的版本不再出32位的系统,只有64位版本的系统。 在c#开发中,form又如何将EviaEarth三维视窗控件放到上去呢? 有办法 以vs2019开发环境为例,新建工程后,添加引用文件:AxInterop.EviaEart…

小白Vue3+Nginx实现部署

文章目录前言一、搭建vue31、查看vue/cli版本,确保vue/cli版本在4.5.0以上2、如果版本达不到,安装或升级你的vue/cli3、创建4、启动可能出现的问题:vue : 无法加载文件 D:\NodeJS\node_global\vue.ps1,因为在此系统上禁止运行脚本。解决办法第…

[基因遗传算法]进阶之三:实践CVRP

实践CVRP 参考资料:《实现VRP常见求解算法——遗传算法(GA)》 属于该篇文章的解读 文章目录实践CVRPA. 定义三个classB.读取数据,打造初始属性卡C. 路线规划D. 生成解的初始空间(初代种群)D. 计算每个路段route的距离E. 计算适应度F.物竞天择F.交叉G.变…

程序员高收入的职业发展方向了解一下

做程序员简单吗?简单! 做高收入的程序员简单吗?不简单! 作为一名程序员,不论是刚出社会的小白,还是技术实力深厚的经验人士,最重要的是要找到适合自己的职业发展方向。 本位就为大家介绍一下程…

微服务框架 SpringCloud微服务架构 28 数据同步 28.2 导入酒店管理项目

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构28 数据同步28.2 导入酒店管理项目28.2.1 案例28 数据同步 28.2 导入酒店…

[附源码]计算机毕业设计健身房信息管理Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

RK3588平台开发系列讲解(SPI篇)SPI内核配置及驱动使用

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、RK3588功能特点二、内核软件2.1、代码路径2.2、SPI 设备配置 —— RK 芯片作 Master 端2.3 、SPI 设备配置 —— RK 芯片作 Slave 端2.4、SPI 设备驱动介绍三、常见问题3.1、SPI 无信号3.2、延迟采样时钟配置方案沉…

OFDM中分析不同频偏(CFO)对通信链路的误码率影响仿真分析

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 OFDM是 Orthogonal Frequency Division MulTIplexing的缩写,即正交频分复用,是一种无线环境下的高速传输技术,也可以看作一种特殊的FDM形式。OFDM 技术的主要思…

Spring更简单的读取和存储对象(一) · 存储Bean对象 · 配置扫描路径 · 五种类注解存储Bean对象 · 方法注解@Bean的使用

之前我们学过存储对象到容器,再从容器里面取出来。这次我们要学习更加简单的操作 Bean 对象的方法。 在 Spring 中想要更加简单的存储和读取对象的核心是使用注解。 存储 Bean 对象一、前置工作:配置扫描路径(重要)二、添加注解存…

非对称加密了解

文章目录什么是非对称加密非对称加密流程非对称加密问题解决方案RSA&ECC椭圆曲线算法RSAECC对称加密大家都里了解的,生成一对密钥对,对外只暴露公钥,来保证双方的安全,下面我们来详细的了解一下 什么是非对称加密 服务端生成…

python -- PyQt5(designer)中文详细教程(十一)实例:俄罗斯方块游戏

俄罗斯方块游戏 本章我们要制作⼀个俄罗斯方块游戏。 Tetris 译注:称呼:方块是由四个小方格组成的 俄罗斯方块游戏是世界上最流行的游戏之⼀。是由⼀名叫Alexey Pajitnov的俄罗斯程序员在1985年制作的,从那时起,这个游戏就风靡…

【猿如意】中的『格式工厂』工具详情介绍

目录一、什么是猿如意二、格式工厂简介三、通过猿如意获取格式工厂四、格式工厂使用技巧4.1 基础设置4.2 使用示例五、格式工厂使用感受六、猿如意使用感受6.1 优点6.2 改进点一、什么是猿如意 【猿如意】是CSDN推出的一款桌面客户端,旨在为广大开发者提供效率工具…

呼声很高的这门语言真的难学吗?

不少同学很想自学Java,但又不知道从何开始?到底该如何系统地去学?学着学着想放弃了……万事开头难,只要跟着系统的阶段学习方法走,条理会很清晰,学起来会更轻松,其实自学真的没有想象的那么难&a…

web课程设计网页规划与设计:旅游网页主题网站设计——酒店主题绿色温泉度假酒店网页设计(8页)HTML+CSS+JavaScript

👨‍🎓学生HTML静态网页基础水平制作👩‍🎓,页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码,这是一个不错的旅游网页制作,画面精明,排版整洁,内容…