【并发】Volatile作用详解

news2024/11/25 18:46:39

  • volatile
    • 保证变量的可见性
    • 禁止指令重排
    • 不保证原子性
      • 如何保证原子性

volatile

  • volatile关键字可以保证变量的可见性。

  • 被volatile修饰的变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。

  • 无法保证原子性

保证变量的可见性

当多个线程访问同一个变量的时候,一个线程修改了这个变量的值,其他线程能够立即看到修改的值。

如果不能保证可见性的话,会导致其他线程无法及时看到修改的值,可能会导致死循环等问题的出现。

使用volatile可以保证可见性,及时通知其他线程。当一个共享变量被volatile修饰时,会保证修改的值立即更新到主存,当有其他线程需要读取时,会从内存中读取新值。这是关键的地方。

禁止指令重排

指令重排序是指编译器和运行时对指令作出重新排序的行为。

禁止指令重排序的关键是执行内存屏障。

public native void loadFence();   // 添加读屏障
public native void storeFence();  // 添加写屏障
public native void fullFence();   // 读写屏障

在这里插入图片描述

不保证原子性

由于volatile的可见性,可能会导致原子性无法保证。这又是为什么呢?

看下面这段代码:

public class TestDemo2 {
    public static class MyTest {
        public volatile int num = 0;
        public void numPlusPlus() {
            num++;
        }
    }

    public static void main(String[] args) {
        MyTest myTest = new MyTest();
        for (int i = 1; i <= 10; i++) {
            new Thread(() -> {
                for (int j = 0; j < 2000; j++) {
                    myTest.numPlusPlus();
                }
            }, "Thread" + i).start();
        }
        while (Thread.activeCount() > 2) {
            Thread.yield();
        }
        
        //结果应该是20000
        System.out.println(Thread.currentThread().getName() + "\t finally num value is " + myTest.num);
    }
}

如果volatile保证原子性的话,结果就应该是20000,但是我们可以看到三次运行的结果是不同的。

在这里插入图片描述

注意:

num++;这一指令其实要执行三个操作:先取值,再自加(tmp),再赋值操作

当多个线程执行numPlusPlus()方法时,线程A读取num=0,执行num+1操作,此时num还没有变化;B线程执行num+1操作。此时A,B保存的num的值都是0,num+1(tmp)的值都为1。

A线程执行赋值的操作,此时,num=1,并将num的值刷新到内存中并通知其他线程保存的num值失效,B读取到num的值为1,而之前tmp保存的结果也为1。

B线程也执行赋值操作num = tmp,结果为1,比预期结果2少了1。

说白了,就是因为volatile不会加锁,多个线程能够同时操作同一变量。

如何保证原子性

使用JUC内部的AtomicInteger类来保证了我们变量相关的原子性。

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

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

相关文章

217页企业大数据能力平台建设技术方案(word可编辑)

1.1.1.1 建设方案架构 数据治理平台覆盖了从标准、设计、采集、开发到使用&#xff0c;再到交付的全数据治理流程&#xff0c;为组织提供了一站式数据治理运营平台&#xff0c;可满足数据共享交换、数据开发、数据运营多种应用场景&#xff0c;并通过构建数据工厂&#xff0c;实…

基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域数据分析能力与项目科研水平

目录 专题一、空间数据获取与制图 专题二、ArcGIS专题地图制作 专题三、空间数据采集与处理 专题四、遥感数据处理与应用 专题五、DEM数据处理与应用 专题六、采样数据处理与应用 专题七、土地利用处理与应用 专题八、土地利用景观格局分析 专题九、土壤数据处理与应用…

【音视频第12天】GCC论文阅读(3)

A Google Congestion Control Algorithm for Real-Time Communication draft-alvestrand-rmcat-congestion-03论文理解 看中文的GCC算法一脸懵。看一看英文版的&#xff0c;找一找感觉。 目录Abstract1. Introduction1.1 Mathematical notation conventions2. System model2.1 …

代码随想录第17天 | 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

654.最大二叉树 /*** Definition for a binary tree node.* function TreeNode(val, left, right) {* this.val (valundefined ? 0 : val)* this.left (leftundefined ? null : left)* this.right (rightundefined ? null : right)* }*/ /*** param {numbe…

2.docker-本地镜像发布

1.发布到阿里云 前往 容器镜像服务 (aliyun.com) 进入容器镜像服务 1.创建命名空间 2.创建镜像仓库 3.进入仓库管理页面获得脚本 # 需要输入密码,终端输出 Login Succeeded 则为登录成功 docker login --username用户名 registry.cn-hangzhou.aliyuncs.com# 标记 docker tag …

TCP 协议的相关特性

TCP 协议的相关特性&#x1f50e;TCP协议的特点&#x1f50e;TCP协议段格式&#x1f50e;TCP协议的相关特性确认应答(ACK)超时重传三次握手四次挥手三次挥手与四次握手的注意事项&#x1f50e;结尾TCP(Transmission Control Protocol) 传输控制协议 &#x1f50e;TCP协议的特点…

Hbase伪分布安装配置

Hbase安装配置 文章目录Hbase安装配置Hbase安装前提下载Hbase压缩包软件版本兼容性Hadoop和HbaseHbase和JDK软件安装软件位置创建数据保存和日志保存文件夹修改配置文件修改hbase-site.xml文件修改hbase-env.sh文件修改~/.bashrc文件启动hbase并验证权限问题Permission denied修…

外源6-BA在缓解多花黄精种子出苗过程中的代谢及转录组学变化

文章标题&#xff1a;Transcriptomics and metabolomics changes triggered by exogenous 6-benzylaminopurine in relieving epicotyl dormancy of Polygonatum cyrtonema Hua seeds 发表期刊&#xff1a;Frontiers in Plant Science 影响因子&#xff1a;6.627 作者单位&a…

电镀废水中的三价铬去除效率

电镀废水中铬的主要存在形式为六价铬&#xff08;绝大多数&#xff09;和三价铬&#xff0c;二者在一定条件下可互相转换&#xff0c;且二者都可能具有致癌左右&#xff0c;有所区别的是六价铬的毒性大约是三价铬毒性的100倍。 目前电镀废水中对铬的处理工艺一般为先将毒性较大…

KD2684S绕组匝间故障检测仪

一、产品简介 KD2684S匝间冲击耐压试验仪适用于电机、变压器、电器线圈等这些由漆包线绕制的产品。因漆包线的绝缘涂敷层本身存在着质量问题&#xff0c;以及在绕线、嵌线、刮线、接头端部整形、绝缘浸漆、装配等工序工艺中不慎而引起绝缘层的损伤等&#xff0c;都会造成线圈层…

【高危】Apache Linkis <1.3.2 存在反序列化漏洞(CVE-2023-29216)

漏洞描述 Apache Linkis 是一个用于将上层应用与底层数据引擎解耦&#xff0c;提供标准化接口的中间件。 该项目受影响版本存在存在反序列化漏洞&#xff0c;由于SqlConnection.java中未对host、port、username,、password等参数进行充分过滤&#xff0c;当恶意用户完全控制应…

SpringSecurity之权限模块设计

目录 前言 实现思路 代码结构 使用说明 前言 前面我们了解了关于微服务权限设计方案以及J W T的相关介绍&#xff0c;今天我们来聊一下&#xff0c;如何避免自己重复的写相同的代码&#xff0c;一次代码实现&#xff0c;即可完美复制到任何项目中实现权限相关的功能。 实现…

进阶方案:仅主机+NAT实现真机与虚拟机实现真正的互联互通

序 昨天写了NAT模式下使用端口转发实现真机可以访问到虚拟机的方案&#xff0c;但是我觉得应该还可以更简单&#xff0c;不需要使用端口转发&#xff0c;然后今天花了一上午的时间终于解决了这个问题&#xff0c;总结一下 仅主机模式 仅主机模式可以让真机跟虚拟机之间形成一…

【数据结构】算法的时间复杂度和空间复杂度 (上)(附leetcode练习题)

☃️个人主页&#xff1a;fighting小泽 &#x1f338;作者简介&#xff1a;目前正在学习C语言和数据结构 &#x1f33c;博客专栏&#xff1a;数据结构 &#x1f3f5;️欢迎关注&#xff1a;评论&#x1f44a;&#x1f3fb;点赞&#x1f44d;&#x1f3fb;留言&#x1f4aa;&…

智慧园区系统未来发展前景及应用趋势分析

完善的系统功能&#xff0c;强大的技术支持&#xff0c;使得智慧园区的应用趋势更加多元化&#xff0c;下面我们一起来了解一下智慧园区系统未来发展前景及应用趋势。 1、人工智能。人工智能技术是智慧园区未来发展的重要方向。人工智能可以帮助园区更好地解决实际问题&…

Docker笔记1 | Docker学习和简介

1 | Docker学习和简介1 学习来源2 官方学习资源3 Docker简介3.1 Docker是什么&#xff1f;3.2 Docker应用场景3.3 Docker架构3.3 Docker的优势3.3 与传统虚拟机的区别1 学习来源 本系列笔记学习主要参考书籍《Docker-从入门到实践》以及结合官网的教程&#xff0c;仅作为个人学…

电脑开机后进不了系统怎么办?

案例&#xff1a;我的电脑开机之后&#xff0c;进入不了系统怎么办&#xff1f; 【今天我打开电脑时&#xff0c;发现进入不了系统&#xff0c;以前从来没有出现过这种情况。有没有小伙伴有解决的办法&#xff1f;在线等&#xff0c;急&#xff01;】 电脑开机后无法进入系统…

node 服务发布后无法访问

node 服务发布后无法访问问题描述&#xff1a;在本地环境访问ip3060端口能正常访问&#xff0c;部署到服务器后访问接口一直超时 解决方法&#xff1a; 看端口是否对外暴露 操作步骤 设置防火墙 点击Windows defender 防火墙 点击高级设置 点击入站规则 新建规则 将3060端口…

《程序员面试金典(第6版)》面试题 10.10. 数字流的秩

题目描述 假设你正在读取一串整数。每隔一段时间&#xff0c;你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。请实现数据结构和算法来支持这些操作&#xff0c;也就是说&#xff1a; 实现 track(int x) 方法&#xff0c;每读入一个数字都会调用该方法&#xff1b; 实现 g…

全球首个完全开源的指令跟随大模型;T5到GPT-4最全盘点

1. Dolly 2.0&#xff1a;世界上第一个完全开源的指令跟随LLM 两周前&#xff0c;Databricks发布了类ChatGPT的大型语言模型 (LLM)Dolly&#xff0c;其训练成本不到 30 美元。今天&#xff0c;他们发布了 Dolly 2.0&#xff0c;这是业内第一个开源的指令跟随LLM&#xff0c;并根…