Java-volatile实现详解(从java到汇编)

news2024/11/27 6:12:26

在Java内存模型一节,除了synchronized外,我们还提到一个常用关键词----volatile,我们说过volatile保证了并发环境的可见性和顺序性,使用volatile修饰的变量,当然值发生改变时,可以同步到其他线程,其他线程按新值进行计算,下面我们编写代码来看下volatile关键词的使用和实现原理,验证我们前面抛出的结论。

当我们使用多线程对共享变量进行操作时,如果不用volatile,会是什么现象呢?以线程一节描述的使用标识位停止线程执行为例说明,代码如下:

public class VolatileTest {
    // 标志位
    boolean mInterrupted = false;
  
    // 设置标志位为true,打断线程运行
    public void needInterrupt(boolean isNeedInterrupt) {
        this.mInterrupted = isNeedInterrupt;
        System.out.println("修改mInterrupted值为:" + mInterrupted + ",time:" + System.currentTimeMillis());
    }

    public static void main(String[] args) {
        VolatileTest test = new VolatileTest();
        new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "开始执行,time:" + System.currentTimeMillis());
            while (!test.mInterrupted) {
            }
            System.out.println(Thread.currentThread().getName() + "结束执行,time:" + System.currentTimeMillis());
        }, "CustomThread1").start();

        new Thread(() -> {
            try {
                Thread.sleep(2000);
                test.needInterrupt(true);
                System.out.println(Thread.currentThread().getName() + "打断关联的线程执行,time:" + System.currentTimeMillis());
            } catch (InterruptedException e) {
            }
        }, "CustomThread2").start();
    }
}

随后运行,输出如下:

1-4-11-1

可以看出在设置标志位为true后,很长一段时间仍未打印CustomThread1停止运行的日志,换而言之,我们虽然在CustomThread2中修改了mInterrupted的值为true,但是CustomThread1中值仍然为false,明显不符合我们预期,那么加上volatile修饰又会怎样呢?修改mInterrupted声明,添加volatile修饰,运行结果如下:

1-4-11-2

可以看出在使用volatile修饰后,在CustomThread2中执行打断后,CustomThread1立即停止运行了。

volatile实现原理

在synchronized实现原理中,我们了解到可以从字节码和汇编码两个角度去了解synchronized的实现,对于volatile,我们不妨也做相同假设,首先我们获取VolatileTest的字节码,看是否有相关实现,字节码代码如下:

1-4-11-3

从字节码可以看出,针对mInterrupted变量而言,除了声明时多了一个ACC_VOLATILE标记,在使用过程中无明显变化。

看来字节码中并没有volatile的核心实现,我们继续使用hsdis获取VolatileTest类的汇编码,进一步确定其实现,字节码如下:

1-4-11-4

可以看到在更新mInterrupted值时,增加了lock addl $0x0,(%rsp)指令,该指令就使得当前对共享变量的修改对其他线程立即生效,而lock addl是内核中的写屏障指令,所以我们一般说volatile关键词底层是通过内存屏障指令实现的。在有volatile修饰的变量需要赋值时,处理器会插入内存屏障指令,将当前线程工作内存的值刷新进主存,同时使得其他线程工作内存中引用的该变量的缓存地址失效,重新从主存同步新值,完成业务逻辑。

volatile与synchronized

volatile与synchronized区别见下表:

关键字并发特性作用级别是否阻塞其他线程字节码实现汇编实现备注
volatile顺序性,可见性变量/lock addl
synchronized顺序性,可见性,原子性变量,函数monitorenter/monitorexit/ACC_SYNCHRONIZEDlock cmpxchg

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

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

相关文章

【python】你的表情包缺不缺?我猜你缺了~来批量获取一波吧~

目录 前言环境使用:模块使用:如何去实现本次案例: <通用模板>代码展示尾语 &#x1f49d; 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 在我们的生活中&#xff0c;总少不了表情包来调剂 少了表情包就会少了很多趣味 今天就来教大家如何批量下载我们的表情包 环…

力扣刷题2023-04-29-1——题目:1431. 拥有最多糖果的孩子

题目&#xff1a; 给你一个数组 candies 和一个整数 extraCandies &#xff0c;其中 candies[i] 代表第 i 个孩子拥有的糖果数目。 对每一个孩子&#xff0c;检查是否存在一种方案&#xff0c;将额外的 extraCandies 个糖果分配给孩子们之后&#xff0c;此孩子有 最多 的糖果…

接触Word的编辑保护【简单版】

首先&#xff0c;我们遇到的情况是下图这样的&#xff1a; 点一下停止保护&#xff0c;是下图这样的&#xff1a; 开始解决&#xff1a; 第一种方式&#xff1a;另存为Word Xml 存好了&#xff0c; 打开如下图&#xff08;我用VS打开的&#xff0c;最好找个能够格式化代码的编…

秘密是如何被泄露的?自建文件分享神器HFS

近年来&#xff0c;随着互联网技术的飞速发展&#xff0c;我们对于互联网的依赖也日益增加。利用互联网这种高效便捷的工具&#xff0c;我们可以随时随地进行文件的传输、图片的分享以及与他人的交流。然而&#xff0c;看似安全的聊天窗口&#xff0c;其实背后是庞大的互联网算…

MybatisPlus动态表名

核心代码 mybatisplus的配置 Configuration public class MybatisPlusConfig {// 这里是存储需要动态变化的表&#xff0c;防止乱操作static List<String> tableList() {List<String> tables new ArrayList<>();//表名tables.add("user");return…

Flask框架的学习---01

1.工程搭建&#xff1a; 安装flask: pip3 install flask 终端运行&#xff1a;flask run 绑定IP地址和端口&#xff1a;Flask run -h 127.0.0.1 -p 8083 修改端口号生产环境&#xff1a;set FLASK_ENVproduction开发模式&#xff1a;set FLASK_ENVdevelopment 虽然 flask …

ChatGPT真的有那么牛吗?

ChatGPT真的有那么牛吗&#xff1f;ChatGPT真的有那么牛吗&#xff1f; 作为一款大型语言模型&#xff0c;ChatGPT确实具有很高的自然语言处理和生成能力&#xff0c;可以生成流畅、准确和有逻辑性的语言&#xff0c;而且能够理解和回答广泛的问题。 它是目前最先进和最强大的…

《HelloGitHub》第 85 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 https://github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 …

奇舞周刊第 491 期 初探 Web 客户端追踪技术

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞推荐 ■ ■ ■ 初探 Web 客户端追踪技术 浏览器的追踪技术是一把双刃剑&#xff0c;它建立了用户个人信息和网站之间的连接&#xff0c;合理地使用能够大大提高用户的体验&#xff0c;但是同时也…

【测试开发】第二节.测开基础篇

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;Java测试开发 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 一、软件测…

盈泰德带你了解产品表面缺陷检测系统

与前几年相比&#xff0c;机器视觉行业在表面检测方面有了很大的突破。检测产品表面的划痕、污渍不再困难&#xff0c;广泛应用于金属、玻璃、手机屏幕、液晶面板等行业的表面检测。 机器视觉检测有以下四种常用的检查和照明方法&#xff1a; 同轴照明、低角度照明、背光照明…

最全最简单scrapy框架搭建(附源码案例)

最近在做项目中,需要网页的大批数据,查询数据是一项体力劳动,原本的我 然而,奋斗了一天的我查到的数据却寥寥无几,后来的我是这样的 作为一个cv工程师,复制粘贴原本是一件很快乐的事情但是它缺给了我无尽的折磨,所以我利用4天时间查询各种资料,翻阅各种视频,终于了解了一个面向…

【五一创作】[论文笔记]图片人群计数CSRNet,Switch-CNN

2018(有代码)_CSRNet (10次) 应用最最广泛的&#xff1a;e, is the most widely used while working with counting problems. 2018_CVPR——CSRNet: Dilated Convolutional Neural Networks for Understanding the Highly Congested Scenes https://arxiv.org/abs/1802.100…

[遗传学]近亲繁殖与杂种优势

目录 近交与杂交的遗传学效应 (1) 近交使基因纯和,杂交使基因杂合 近交效应: (2) 近交系数与亲缘系数 (3)运用通径分析方法计算近交系数和亲缘系数 ① 通径与通径链 ② 通径分析的理论及其应用 (4)近交降低群体基因型值的平均值,杂交提高群体均值 (5)近交使群体分化,杂…

mysql卸载及Ubuntu降级mysql并安装MySQL5.7并修改键盘失灵问题及 centos_x86.64安装MySQL5.7及修改密码及设置访问

卸载mysql 可以看centos_x86.64安装MySQL5.7标题的卸载 查看MySQL的依赖项 dpkg --list|grep mysql 卸载 mysql-common sudo apt remove mysql-common 卸载 mysql-server sudo apt autoremove --purge mysql-server 清除残留数据 dpkg -l|grep ^rc|awk ‘{print$2}’|sudo …

java.lang.NoSuchFieldException: TYPE

环境: IDEA 2022.1.4 SQL 2012 今日启动SpringBoot项目&#xff0c;出现 Initializing Spring embedded WebApplicationContext。 启动失败&#xff0c;我百度了下&#xff0c;说可能是下了断点&#xff0c;可我没有下断点。 2023-04-29 15:40:02.039 INFO 13676 --- [ …

Vue.js按键修饰符及v-model修饰符

目录 一、按键修饰符 &#xff08;1&#xff09;回车键按键修饰符示例 &#xff08;2&#xff09;自定义按键修饰符示例 二、v-model修饰符 &#xff08;1&#xff09;.lazy &#xff08;2&#xff09;.number &#xff08;3&#xff09;.trim 一、按键修饰符 v-on指令用…

【计算机图形学】三维图形投影和消隐(正等轴测投影图 消隐图构造)

模块4-2 三维图形投影和消隐 一 实验目的 编写三维图形各种变换的投影或消隐算法 二 实验内容 1&#xff1a;自行选择三维物体&#xff08;不能选长方体&#xff09;&#xff0c;建立坐标系&#xff0c;给定点的三维坐标值&#xff0c;建立边表结构&#xff0c;完成正等轴测…

【VM服务管家】VM4.x算法模块开发_4.2 联合OpenCV开发

目录 4.2.1 环境配置&#xff1a;使用OpenCV开发的环境配置4.2.2 图像类算法&#xff1a;使用OpenCV开发算法模块的方法 4.2.1 环境配置&#xff1a;使用OpenCV开发的环境配置 描述 环境&#xff1a;VM4.0.0及以上 VS2013 现象&#xff1a;使用第三方库OpenCV开发时&#xff…

记录-做一个文件拖动到文件夹的效果

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 在我的电脑中&#xff0c;回想一下我们想要把一个文件拖动到另一个文件夹是什么样子的呢 1:鼠标抓起文件 2:拖动文件到文件夹上方 3:文件夹高亮&#xff0c;表示到达指定位置 4:松开鼠标将文件夹放入文…