Volatile系列(一):Volatile测试案例一可见性

系列文章

Volatile测试案例一可见性

目录

前言

测试1

逻辑

代码

结果

测试2

逻辑

代码

结果

结论

原理探讨(可见性)



前言

多线程是 JAVA 并发编程的主要应用,并发环境能大幅提高应用性能,提高 CPU 使用率,但是并发环境下也引出许多问题。今天咱们主要探讨的就是多线程并发中的一个关键字:Volatile

Volatile 的主要作用:

  • 内存可见性
  • 禁止指令重排序

测试1

逻辑

1.创建一个 BOOL 结束标记,用于结束线程

2.启动多个线程(这里 10 )

3.将结束标记改为 false

代码

public class VolatileExample {

    private static boolean BOOL = true;

    public static void main(String[] args) throws InterruptedException {
        test1();
    }

    private static void test1() throws InterruptedException {
        for (int i = 0; i < 10; i++) {
            new Thread(() -> { while (BOOL) { } },"VolatileThread-"+i).start();
        }
        TimeUnit.MILLISECONDS.sleep(500);
        BOOL = false;
        RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
        String name = runtime.getName();
        System.out.println("当前进程的标识为:" + name);
    }

}

结果

1.通过 java 自带的 jstack 命令,截取 name 中的 @ 前的数字作为 pid(我这里为 11744 )

2.运行 jstack -l pid

3.当前查看到的线程情况(部分线程)

4.观察当前线程可知部分线程未接收到  BOOL 标记的改变而结束线程
 

测试2

逻辑

1.在测试1的逻辑基础上,添加 volatile 关键字

代码

public class VolatileExample {

    private volatile static boolean BOOL = true;

    public static void main(String[] args) throws InterruptedException {
        test1();
    }

    private static void test1() throws InterruptedException {
        for (int i = 0; i < 10; i++) {
            new Thread(() -> { while (BOOL) { } },"VolatileThread-"+i).start();
        }
        TimeUnit.MILLISECONDS.sleep(500);
        BOOL = false;
        RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
        String name = runtime.getName();
        System.out.println("当前进程的标识为:" + name);
    }

}

结果

1.一旦加上 volatile 关键字,当前进行在极短的时间内结束

结论

1.直观来看,volatile 保证了变量的内存可见性,它使得变量能在不同线程中共享

2.这里线程的开始可以使用栅栏统一控制

原理探讨(可见性)

在 JMM 中,可见性问题存在于主内存、CPU内部多级缓存之间。CPU内部多级缓存与主内存是保持同步的,主要通过缓存⼀致性协议(MESI)来解决但是一但涉及一致性,这就相当消耗性能。为此,线程又维护了自己的一份本地缓存,这又导致了新的可见性问题,线程本地缓存与主内存不一致。

Volatile 就是为了解决变量不一致的问题的,也就是可见性问题。其做法是:

  1. 它会强制将对缓存的修改操作立即写入主存;
  2. 如果是写操作,它会导致其他CPU中对应的缓存行无效
  3. 如果是读操作,它发现当前缓存失效后直接去主内存中读取

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

优雅的接口防刷处理方案

前言 本文为描述通过Interceptor以及Redis实现接口访问防刷Demo 这里会通过逐步找问题&#xff0c;逐步去完善的形式展示 原理 通过ip地址uri拼接用以作为访问者访问接口区分 通过在Interceptor中拦截请求&#xff0c;从Redis中统计用户访问接口次数从而达到接口防刷目的 …

不应使用Excel进行项目资源规划的 7 个原因

项目资源规划早期仅限于基本分配和调度。因此&#xff0c;企业使用自制工具或excel表来执行这一简单功能。然而&#xff0c;随着技术和业务流程的发展&#xff0c;资源规划变得复杂&#xff0c;并包括其他组成部分&#xff0c;如预测和容量规划&#xff0c;优化等。 由于传统…

掌握好这几款TikTok数据分析工具,让你轻松提高曝光率!

为什么别人在TikTok发的普普通通的视频却有那么高的流量、几天内疯狂涨粉&#xff0c;而自己想破脑袋装饰自己的视频&#xff0c;结果却不如人意。 其实原因很简单&#xff0c;TikTok不像国内的抖音只面向中华民族&#xff0c;而是覆盖了150多个国家和75种语言用户&#xff0c…

【通信接口】UART、IIC、SPI

目录 一、预备知识 1、串行与并行 2、单工与双工 3、波特率 二、UART 三、IIC 四、SPI &#xff08;一对一、一对多&#xff09; 五、IIC、SPI异同点 参考文章&#xff1a;这些单片机接口&#xff0c;一定要熟悉&#xff1a;UART、I2C、SPI、TTL、RS232、RS422、RS485…

【Java EE初阶】计算机简介及多线程之创建线程

目录 1.计算机发展史 2.冯诺依曼体系 3.操作系统 操作系统的作用&#xff1a; 4.进程 1.PID&#xff08;进程编号&#xff09; 2.内存指针 应用程序申请到的内存中的首地址 3.文件描述符表 问&#xff1a;什么是并发&#xff1f;什么是并行&#xff1f; 4.进程的优先级&a…

卡尔曼滤波原理及代码

目录 一.简介 二.原理 1.先验估计原理 2.后验估计原理 3.总结 三.示例 一.简介 卡尔曼滤波&#xff08;Kalman filtering&#xff09;是一种利用线性系统状态方程&#xff0c;通过系统输入输出观测数据&#xff0c;对系统状态进行最优估计的算法&#xff0c;它可以在任意…

StarRocks 3.0 集群安装手册

本文介绍如何以二进制安装包方式手动部署最新版 StarRocks 3.0集群。 什么是 StarRocks StarRocks 是新一代极速全场景 MPP (Massively Parallel Processing) 数据库。StarRocks 的愿景是能够让用户的数据分析变得更加简单和敏捷。用户无需经过复杂的预处理&#xff0c;就可以…

同步辐射X射线断层扫描成像在各行业的应用

同步辐射X射线断层扫描成像在各行业的应用 同步辐射X射线断层扫描成像&#xff08;synchrotron radiation X-ray computed tomography&#xff0c;SRCT&#xff09;是一种非侵入式、高分辨率的成像技术&#xff0c;利用同步辐射光束产生的高强度、高亮度、单色性和相干性的X射线…

【面试】MySQL事务的12连问

文章目录 前言1. 什么是数据库事务&#xff1f;2. 事务的四大特性3. 事务的隔离级别有哪些&#xff1f;MySQL的默认隔离级别是什么&#xff1f;4. Mysql为什么选择RR作为默认隔离级别&#xff1f;5. 很多大厂为什么选择RC数据库隔离级别&#xff1f;6. 并发场景&#xff0c;数据…

Qt连接MySql数据库(本地和远程数据库均可)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 三种方法方法一 略方法二 使用ODBC设置mysql为数据源库1. 添加ODBC数据源&#xff0c;在控制面板中找到管理工具&#xff0c;其中有ODBC数据源 64位的&#xff0c;打…

数字孪生与元宇宙:数字化科技的双向融合之路

概念 &#xff08;1&#xff09;元宇宙&#xff08;Metaverse&#xff09;是一个虚拟的三维世界&#xff0c;由数字内容和物理世界中的现实空间相互交织而成&#xff0c;能够提供各种虚拟体验&#xff0c;例如虚拟现实、增强现实、虚拟社交、虚拟经济等。在元宇宙中&#xff0…

8种不同类型的防火墙

什么是防火墙&#xff1f; 防火墙是一种监视网络流量并检测潜在威胁的安全设备或程序&#xff0c;作为一道保护屏障&#xff0c;它只允许非威胁性流量进入&#xff0c;阻止危险流量进入。 防火墙是client-server模型中网络安全的基础之一&#xff0c;但它们容易受到以下方面的…

连ChatGPT都不懂的五一调休,到底怎么来的?

今天是周几&#xff1f; 你上了几天班了&#xff1f; 还要上几天班放假&#xff1f; 五一啥安排&#xff1f; 出行的票抢到了吗&#xff1f; 调休到底是谁发明的&#xff1f;&#xff01; 五一劳动节是要劳动吗&#xff1f; 为什么昨天是周一&#xff0c;今天还是周一&a…

差分优化算法——DE

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; 目录 一、DE1.步骤2.特点 二、DE Optimiza1.函数最小值问题2.差分进化算法求解2.Java 实现与结果绘图 一、DE 差分进化算法是一种基于群体智能的优化算法&#xff0c;由Storn和Price于1995年提出&#xff0c;最早用…

基于DSP+FPGA+ADS1282支持32Bit高精度数据采集方案(三)系统性能测试

系统性能分析与测试 本章将首先对系统电路的噪声和温漂进行分析&#xff0c;而后对采集系统的性能进行 测试&#xff0c;并对测试数据进行分析。 5.1 高精度 AD 转换电路噪声和温漂分析 5.1.1 电阻噪声与温漂 1 、电阻的噪声 电阻是一种噪声源&#xff0c;其严重程度取…

嵌入式就业怎么样?

嵌入式就业怎么样? 现在的IT行业,嵌入式是大热门&#xff0c;下面也要来给大家介绍下学习嵌入式之后的发展以及就业怎么样。 首先是好找工作。嵌入式人才目前是处于供不应求的状态中&#xff0c;据权威统计机构统计在所有软件开发类人才的需求中&#xff0c;对嵌入式工程师的…

matlab 点云滤波(中值、均值、高斯滤波)代码

点云中值、均值、高斯滤波 介绍一下滤波函数 smoothdata: 对含噪数据进行平滑处理 B smoothdata(___,method) 为上述任一语法指定平滑处理方法。例如&#xff0c;B smoothdata(A,sgolay) 使用 Savitzky-golay 滤波器对 A 中的数据进行平滑处理。Method-平滑处理方法 "…

Springboot获取jar包中resources资源目录下的文件

阿萨斯多问题现象&#xff1a; 今天在项目中遇到一个业务场景&#xff0c;需要用到resources资源目录下的文件&#xff0c;然后就在思考一个问题&#xff1a; 当项目打成jar后&#xff0c;Springboot要如何获取resources资源目录下的文件呢&#xff1f; 问题分析&#xff1a; 如…

GitLABJenkins

GitLAB & Jenkins 目录 实践&#xff1a;基于Jenkins提交流水线(测试成功)-2023.4.25 目的&#xff1a;掌握通过触发器将GitLab和Jenkins集成&#xff0c;实现提交流水线。 1、触发Jenkins构建 安装Generic Webhook Trigger插件 重启后&#xff0c;进入一个Pipeline项目设…

用Java创建可扩展的OpenAI GPT应用程序

ChatGPT 值得深入使用的方面之一是它的引擎&#xff0c;它不仅为基于Web的聊天机器人提供动力&#xff0c;还可以集成到Java应用程序中。 ▌Budget Journey App 想象一下&#xff0c;你想去一个城市旅行并且设置好了预算&#xff0c;你应该如何分配你的钱并让你的旅行难忘&am…