JUC之volatile关键字

Volatile
volatile修饰的变量有两大特点:可见性与有序性
volatile的内存语义
在这里插入图片描述
volatile凭什么可以保证可见性和有序性???内存屏障 Memory Barrier

内存屏障
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
四大屏障
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Volatile保证可见性、没有原子性,指令禁重排。
保证可见性:保证不同线程对某个变量完成操作后结果及时可见,即该共享变量一旦改变所有线程立即可见。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
volatile不保证原子性
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

volatile变量不适合参与到依赖当前值的运算

重排序
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
volatile写操纵,在volatile变量之前与之后加了两种类型的内存屏障的代码含义演示,禁止指令重排
在这里插入图片描述
volatile读之后的操作,都禁止重排序待volatile之前
在这里插入图片描述
volatile的使用场景
1.单一赋值2.状态标志3.开销较低的读、写锁策略4.双重锁校验

在这里插入图片描述
状态标志位使用场景演示
在这里插入图片描述
开销较低的读、写锁策略
在这里插入图片描述
双重锁校验
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
解决隐患思路:利用volatile,禁止“初始化对象(2)”和“设置singleton指向内存空间(3)”的重排序

volatile总结

可见性
在这里插入图片描述
有序性(禁止指令重排)
写指令
在这里插入图片描述
读指令
在这里插入图片描述
字节码层面
在这里插入图片描述
内存屏障是什么?
内存屏障: 是一种屏障指令,它使得CPU或者编译器对屏障指令的前和后所发出的内存操作,执行一个排序的约束。也叫内存栅栏或栅栏指令
内存屏障能干嘛
阻止屏障两边的指令重排序,写数据时加入屏障,强制将线程私有工作内存的数据刷回主物理内存。读数据时加入屏障,线程私有工作内存的数据失效,重新到主物理内存中获取最新数据。
内存屏障的四大指令
1.在每一个volatile写操作前面插入一个StoreStore屏障
2.在每一个volatile写操作后面插入一个StoreLoad屏障
3.在每一个volatile读操作后面插入一个LoadLoad屏障
4.在每一个volatile读操作后面插入一个LoadStore屏障

在这里插入图片描述

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

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

相关文章

手撕算法-对称二叉树

力扣101. 对称二叉树 链接 https://leetcode.cn/problems/symmetric-tree/description/ 题目描述 给你一个二叉树的根节点 root , 检查它是否轴对称。示例1:此树是对称的。示例2:此树也是对称的示例3:此树不对称 思路 一颗…

【WEEK3】学习目标及总结【SpringMVC】【中文版】

学习目标: 三周完成SpringMVC入门——第三周 感觉这周很难完成任务了,大概率还会有第四周 学习内容: 参考视频教程【狂神说Java】SpringMVC最新教程IDEA版通俗易懂数据处理JSON交互处理 学习时间及产出: 第三周 MON~FRI 2024.…

15 stack和queue的实现

栈和队列作为容器适配器,只需要将容器封装模板,传入什么容器用什么容器就好了 栈 #pragma oncetemplate <class T, class container vector<T>> class stack { public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}T& top(){…

代码缺陷代价

目录 什么是语法缺陷什么是类型安全缺陷什么是内存和资源安全缺陷什么是并发安全缺陷什么是错误处理缺陷 什么是语法缺陷 语法缺陷是指程序中存在的语法错误或违反语法规则的问题。它通常是由于编程语言的语法规则不符合要求导致的。例如&#xff0c;缺少分号、括号不匹配、关…

peft模型微调--Prompt Tuning

模型微调&#xff08;Model Fine-Tuning&#xff09;是指在预训练模型的基础上&#xff0c;针对特定任务进行进一步的训练以优化模型性能的过程。预训练模型通常是在大规模数据集上通过无监督或自监督学习方法预先训练好的&#xff0c;具有捕捉语言或数据特征的强大能力。 PEF…

ubuntu(20.04)-安装JAVA环境-IDEA

1.下载IDEA 2.解压文件 sudo tar -zxvf idealC-2022.2.3.tar.gz -C /opt 3.添加环境变量&#xff1a; .vim ~/.bashrc export IDEA_HOME/opt/ideaIC-2022.2.3/ export PATH${IDEA_HOME}/bin:$PATH source ~/.bashrc 4.启动&#xff1a; cd /opt/ideaIC-2…

什么是SFP光模块?如何选择?

SFP光模块作为全球制造商和供应商的行业标准&#xff0c;至今仍被广泛使用。在许多网络中&#xff0c;如SONET、千兆以太网、光纤通道、PON和其他通信标准中&#xff0c;SFP光模块已经成为行业的中坚力量。本指南将为您介绍一些关于选择SFP模块的技巧。 什么是SFP光模块&#…

什么是浅拷贝和深拷贝

目录 一、概念 浅拷贝&#xff08;Shallow Copy&#xff09; 深拷贝&#xff08;Deep Copy&#xff09; 二、Java中使用工具来帮助进行对象的拷贝 ⭐三、bean工具类 总结 一、概念 当涉及到对象复制时&#xff0c;浅拷贝和深拷贝是两个重要的概念。它们描述了在复制对象…

Docker部署ChatGLM3、One API、FastGPT

创建并运行chatglm3容器 docker run --name chatglm3 -p 8000:8000 registry.cn-hangzhou.aliyuncs.com/ryyan/chatglm.cpp:chatglm3-q5_1 创建并运行one-api容器 (其中挂载路径 D:\one-api 可以选择你自己喜欢的目录) docker run --name oneapi -d -p 3000:3000 -e TZAsia…

Linux下的多线程编程:原理、工具及应用(2)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;Flower of Life—陽花 0:34━━━━━━️&#x1f49f;──────── 4:46 &#x1f504; ◀️ ⏸ ▶️ ☰ …

第二十四节 Java 异常处理

什么是异常&#xff1f; 程序运行时&#xff0c;发生的不被期望的事件&#xff0c;它阻止了程序按照程序员的预期正常执行&#xff0c;这就是异常。异常发生时&#xff0c;是任程序自生自灭&#xff0c;立刻退出终止&#xff0c;还是输出错误给用户&#xff1f;或者用C语言风格…

中国电子学会(CEIT)2020年12月真题C语言软件编程等级考试三级(含详细解析答案)

中国电子学会&#xff08;CEIT&#xff09;考评中心历届真题&#xff08;含解析答案&#xff09; C语言软件编程等级考试三级 2020年12月 编程题五道 总分:100分一、完美立方&#xff08;20分&#xff09; 形如1、完美立方 形如a^3 b^3 c^3 d^3的等式被称为完美立方等式…

Machine Vision Technology:Lecture3 Edge detection | Fitting

Machine Vision Technology&#xff1a;Lecture3 Edge detection | Fitting Finite difference filters有限差分滤波器Effects of noise噪声对边缘检测影响Derivative theorem of convolution卷积的导数定理Derivative of Gaussian filter高斯滤波器的导数Smoothing vs. deriva…

2、设计模式之单例模式详解(Singleton)

单例模式详解 一、什么是单例模式 单例模式是Java中最简单的设计模式之一。这种类型的设计模式属于创建者模式&#xff0c;它提供了一种访问对象的最佳方式。 这种设计模式涉及到一个单一的类&#xff0c;该类负责创建自己的对象&#xff0c;同时确保只有单个对象被创建。这个…

后端系统开发之——创建SpringBoot工程

原文地址&#xff1a;后端框架系统开发之——创建SpringBoot工程 - Pleasure的博客 下面是正文内容&#xff1a; 前言 现在的市场环境&#xff0c;如果你单单只是作为前端工程师或者是后端工程师&#xff0c;在开发Web应用的时候都需要去读取企业提供的接口文档。而当你前后端…

【ARM】UBL本地服务器离线激活license

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 UBL本地服务器离线激活license。 2、 问题场景 解决有用户外出时激活 license。 3、软硬件环境 1&#xff09;、软件版本&#xff1a;MDK5.39 2&#xff09;、电脑环境&#xff1a;Ubuntu 20.04 LTS 3&…

NCV4275CDT50RKG稳压器芯片中文资料规格书PDF数据手册引脚图图片价格功能

产品概述&#xff1a; NCV4275C 是一款低漏稳压器&#xff0c;可用于严酷汽车环境。它包括了较宽的运行温度范围和输出电压范围。输出调节为 5.0 V 或 3.3 V&#xff0c;额定输出电流为 450 mA。它还提供过电流保护、超温保护和可编程微处理器重置等多种功能。NCV4275C 采用 D…

linux ffmpeg编译

下载源码 https://ffmpeg.org/ csdn下载源码包 不想编译可以直接下载使用静态版本 https://ffmpeg.org/download.html https://johnvansickle.com/ffmpeg/ 根据cpu类型&#xff0c;下载解压后就可以直接使用了。 linux编译 安装底层依赖 yum install gcc yum isntall …

机器学习模型—CatBoost

机器学习模型—CatBoost 作为俄罗斯科技公司Yandex推出的开源机器学习库,CatBoost可以说是当前Gradient Boosting算法发展的新里程碑。相较于广为人知的XGBoost,CatBoost在处理类别特征、纵向样本采样和有序训练数据方面做出了创新性的改进,展现了卓越的性能。 我们经常遇到包…

接口测试和功能测试有什么区别

本文主要分为两个部分&#xff1a; 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什么要做&#xff1f; 第二部分&#xff1…