volatile

volatile: 用来声明变量的关键字之一,它的主要作用是确保多个线程能够正确地处理共享变量。在多线程编程中,如果一个变量被多个线程共享并且这些线程可能同时修改该变量的值,那么就需要使用 volatile 关键字来保证线程之间对该变量的操作是可见的、有序的。

特点:

1、可见性(Visibility)

当一个变量被 volatile 关键字修饰时,如果一个线程修改了这个变量的值,那么其他线程将立即看到这个修改。这是因为 volatile 会告诉 JVM 不要将该变量缓存在线程的工作内存中,而是直接从主内存中读取和写入变量的值。

1.JMM(Java Memory Model)

一种规范,用于定义 Java 程序中多线程并发访问共享内存时的行为。JMM 主要关注的是多线程之间如何访问共享变量以及如何同步它们的访问。
在这里插入图片描述
线程工作内存是拷贝系统主内存的数据,然后对于数据操作,写入线程。当一方改变主内存数据时,另一方不可见。
八种指令操作
lock(锁定): 作用于主内存的变量,它把一个变量标识为一条线程独占的状态;
unlock(解锁): 作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定;
read(读取): 作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用;
load(载入): 作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中;
use(使用): 作用于工作内存的变量,它把工作内存中一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作;
assign(赋值): 作用于工作内存的变量,它把一个从执行引擎接收的值赋给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作;
store(存储): 作用于工作内存的变量,它把工作内存中一个变量的值传送到主内存中,以便随后的write操作使用;
write(写入): 作用于主内存的变量,它把store操作从工作内存中得到的变量的值放入主内存的变量中;

2.代码展示

//当我们不加volatile,程序就不会结束,主线程修改主内存数据,不会通知线程a
private static volatile int a = 0;
public static void main(String[] args) {new Thread(()->{while (a == 0){}},"a").start();try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {throw new RuntimeException(e);}a = 1;System.out.println("q =>" + a);
}

2.不能保证原子性

原子性是指一个操作是不可分割的,要么全部执行成功,要么全部不执行,不存在中间状态。在并发编程中,原子性是保证多线程并发操作共享变量时的一个重要特性。

1.代码示例

//volatile不保证原子性
private volatile static int a = 0;
private static Lock lock = new ReentrantLock();
//synchronized lock 可以保证原子性
public static void add() {lock.lock();try {a++;}catch (Exception e){}finally {lock.unlock();}}
public static void main(String[] args) {for (int i = 1; i <= 20; i++) {new Thread(()->{for (int j=0;j<1000;j++){add();}}).start();}//上面线程执行完执行主线程while (Thread.activeCount() > 2){Thread.yield();}//输出结果期待值是2WSystem.out.println("a=>" + a);
}

2.并发编程保证原子性操作

1.synchronized 关键字: 使用 synchronized 关键字可以保证某个代码块或方法在同一时刻只能被一个线程执行,从而确保了对共享资源的原子性访问。

public static synchronized void add() {a++;
}

2.Lock 接口: 使用 Lock 接口及其实现类(如 ReentrantLock)也可以实现对共享资源的原子性访问。

public static void add() {lock.lock();try {a++;}catch (Exception e){}finally {lock.unlock();}}

3.原子类(Atomic Classes): Java 并发包中提供了一系列原子类,如 AtomicInteger、AtomicLong 等,它们提供了一种线程安全的方式来更新共享变量的值,保证了原子性操作。

private static AtomicInteger a = new AtomicInteger();
public static void add(){a.getAndIncrement();
}
public static void main(String[] args) {for (int i = 1; i <= 20; i++) {new Thread(()->{for (int j=0;j<1000;j++){add();}}).start();}//上面线程执行完执行主线程while (Thread.activeCount() > 2){Thread.yield();}//输出结果期待值是2WSystem.out.println("a=>" + a);
}

3.禁止指令重排序(Preventing Instruction Reordering)

关键字还可以禁止 JVM 对指令进行重排序优化,保证指令执行顺序与程序中的代码顺序一致。这样可以避免由于指令重排序导致的线程安全问题。
1.编译器优化重排序: 编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。
2.指令级并行的重排序: 现代处理器采用了指令级并行技术(Instruction-Level Parallelism, ILP)来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。
3.内存系统的重排序: 处理器使用缓存和读写缓冲区,这使得加载和存储操作看上去可能是在乱序执行(强调的是内存缓存)。
在这里插入图片描述

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

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

相关文章

算法打卡day35

今日任务&#xff1a; 1&#xff09;343. 整数拆分 2&#xff09;96.不同的二叉搜索树 3&#xff09;复习day11 343. 整数拆分 题目链接&#xff1a;343. 整数拆分 - 力扣&#xff08;LeetCode&#xff09; 给定一个正整数 n&#xff0c;将其拆分为至少两个正整数的和&#xf…

【kafka】安装

也是第二次安装&#xff0c;蛮记录一下 1.安装kafka之前需要先完成zookeeper的安装 【zookeeper】安装 2. Apache Kafka官网下载 3. 解压完成后修改server.properties配置文件 修改日志文件存放路径 查看与zookeeper连接的端口是否和zookeeper服务所在的端口一致 &#xf…

Transformer的Decoder的输入输出都是什么

目录 1 疑问&#xff1a;Transformer的Decoder的输入输出都是什么 2 推理时Transformer的Decoder的输入输出 2.1 推理过程中的Decoder输入输出 2.2 整体右移一位 3 训练时Decoder的输入 参考文献&#xff1a; 1 疑问&#xff1a;Transformer的Decoder的输入输出都是什么 …

小型燃气站3D可视化:打造安全高效的燃气新时代

随着科技的不断进步&#xff0c;越来越多的行业开始融入3D可视化技术&#xff0c;燃气行业也不例外。 小型燃气站作为城市燃气供应的重要节点&#xff0c;其安全性和运行效率至关重要。传统的燃气站管理方式往往依赖于人工巡检和纸质记录&#xff0c;这种方式不仅效率低下&…

【数据结构】树与二叉树、树与森林部分习题以及算法设计例题 2

目录 【数据结构】树与二叉树、树与森林部分习题以及算法设计例题一、交换二叉树每个结点的左右孩子Swap 函数&#xff08;先序遍历&#xff09;&#xff1a;Swap 函数&#xff08;中序遍历&#xff09; 不可行&#xff1a;Swap 函数&#xff08;后序遍历&#xff09;&#xff…

授权协议OAuth 2.0之JWT

写在前面 本文看下JWT相关内容。 1&#xff1a;为什么需要JWT OAuth2.0规范中并没有规定access_token使用什么样的格式&#xff0c;只要求满足&#xff0c;不连续性&#xff0c;不可猜测性&#xff0c;不可重复性就可以了&#xff0c;所以我们在生成accest_token的时候就比较…

格雷希尔G80L-T系列大口径快速连接器,在汽车膨胀水箱的气密性测试密封方案

副水箱也有人称作膨胀水箱&#xff0c;是汽车散热系统的一个重要组成部分&#xff0c;当水箱里面的温度过高的时候就会产生一定的压力&#xff0c;而副水箱可以根据热胀冷缩来帮助水箱和发动机排出去多余的水&#xff0c;起到一个调节的作用&#xff0c;副水箱由PP/PE塑料注塑而…

spring高级篇(一)

1、ApplicationContext与BeanFactory BeanFactory是ApplicationContext的父级接口&#xff1a;&#xff08;citlaltu查看类关系图&#xff09; 在springboot的启动类中&#xff0c;我们通过SpringApplication.run方法拿到的是继承了ApplicationContext的ConfigurableApplicatio…

Qt使用miniblink第三方浏览器模块

文章目录 一、前言二、miniblink简介三、miniblink使用四、运行效果五、工程结构 一、前言 本文取自刘典武大师&#xff1a;Qt编写地图综合应用58-兼容多浏览器内核 用Qt做项目过程中&#xff0c;遇到需要用到浏览器控件的项目&#xff0c;可能都会绕不开一个问题&#xff0c;那…

【Web】VS Code 插件

专栏文章索引&#xff1a;Web 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、安装步骤 二、插件 1.Chinese (Simplified) (简体中文) 2.open in browser 3.vscode-icons 4.Live Server 5.Live Server Preview 6.翻译(英汉词典) 一、安装步骤 点击 “扩…

创纪录的里程碑!光镊阵列捕获逾6,000中性原子,量子计算再达新高

论文链接&#xff1a; https://arxiv.org/abs/2403.12021 2024年3月18日&#xff0c;研究人员成功开发出一种大规模光镊阵列&#xff0c;能够在12,000个位点上捕获超过6,100个中性原子&#xff0c;同时在几个关键性能指标上达到新的高度&#xff1a; 1&#xff09;相干时间达到…

新零售门店、商品、会员管理指标体系总览

新零售&#xff0c;旨在打破传统零售业的边界&#xff0c;引入先进科技和数字化手段&#xff0c;通过整合线上线下渠道&#xff0c;全面提升用户体验&#xff0c;并实现更智能、高效、个性化的零售运营模式。这一模式不仅仅关注销售产品&#xff0c;更注重构建全方位的购物生态…

《中医临床诊疗术语》数据库

最新版的《中医临床诊疗术语》于2023年3月17日由国家中医药管理局提出的&#xff0c;由国家市场监督管理总局和国家标准化管理委员会共同发布。新版的修订是为落实相关政策文件要求&#xff0c;推进中医医疗服务规范化、标准化管理&#xff0c;提高中医医疗服务标准化水平和管理…

asyncio异步编程

参考视频&#xff1a;02 协程_哔哩哔哩_bilibili 1.协程&#xff1a;&#xff08;不是计算机中真实存在的&#xff0c;人为创造出的概念&#xff09;&#xff0c;也可称为微线程。 本质是用一个线程在一段代码中来会切换游走的线程&#xff0c;是一种用户态内的上下文切换技术…

中科驭数:DPU是构建高效智算中心基础设施的必选项

4 月 15 日&#xff0c;在江苏省未来网络创新研究院、网络通信与安全紫金山实验室举办的“2024智算网络技术与应用创新峰会”上&#xff0c;中科驭数作为DPU算力基础设施领军企业&#xff0c;受邀出席本次峰会。中科驭数产品运营部副总经理曹辉先生在《基于DPU的高效智算中心算…

OpenCV与AI深度学习 | 2024年AI初学者需要掌握的热门技能有哪些?

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;2024年AI初学者需要掌握的热门技能有哪些&#xff1f; 0 导 读 本文主要介绍2024年AI初学者需要掌握的热门技能。 1 前 言 人工智能无疑是技…

基于java+springboot+vue实现的智慧党建系统(文末源码+Lw+ppt)23-58

摘 要 当今社会进入了科技进步、经济社会快速发展的新时代。国际信息和学术交流也不断加强&#xff0c;计算机技术对经济社会发展和人民生活改善的影响也日益突出&#xff0c;人类的生存和思考方式也产生了变化。传统智慧党建管理采取了人工的管理方法&#xff0c;但这种管…

openGauss学习笔记-264 openGauss性能调优-TPCC性能调优测试指导-BIOS配置

文章目录 openGauss学习笔记-264 openGauss性能调优-TPCC性能调优测试指导-BIOS配置264.1 恢复BIOS出厂设置264.2 修改相关BIOS设置264.3 重启操作系统 openGauss学习笔记-264 openGauss性能调优-TPCC性能调优测试指导-BIOS配置 本章节主要介绍openGauss数据库内核基于鲲鹏服务…

BTI功能验证与异常解析

BTI分支目标识别精讲与实践系列 思考 1、什么是代码重用攻击&#xff1f;什么是ROP攻击&#xff1f;区别与联系&#xff1f; 2、什么是JOP攻击&#xff1f;间接分支跳转指令&#xff1f; 3、JOP攻击的缓解技术&#xff1f;控制流完整性保护&#xff1f; 4、BTI下的JOP如何…

【MATLAB源码-第53期】m代码基于粒子群算法(PSO)的三维路径规划,显示最优路径和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;简称PSO&#xff09;是一种模拟鸟群觅食行为的启发式优化方法。以下是其详细描述&#xff1a; 基本思想&#xff1a; 鸟群在寻找食物时&#xff0c;每只鸟都…