volatile关键字的作用java

1.内存可见性

        当一个变量被声明volatile时,它会保证被修改的值被立刻更新到主内存中,不会优化到寄存器或缓存中

2.禁止指令重排序

        针对被volatile修饰的变量的读写相关指令,是不能被重新排序的

代码演示

class Counter{public int flag;
}
public class Thread3 {public static void main(String[] args) throws InterruptedException {Counter counter=new Counter();Thread t1=new Thread(()->{while (counter.flag==0){//方便演示什么都不做}});Scanner scanner=new Scanner(System.in);Thread t2=new Thread(()->{counter.flag=scanner.nextInt();});t1.start();t2.start();t1.join();t2.join();}
}

上述代码,t1线程在循环检查flag值,成立就执行代码,t2线程更改count值,使得线程1检查结果不成立,测试发现在t2线程代码输入结果后,线程1代码还是不会停止,这是由于t1线程在一个无限循环中检查flag的值,并且flag的更新对t1线程不可见,因此t1线程可能会永远等待下去,即使t2线程已经修改了flag的值。

使用volatile解决

class Counter{public volatile int flag; // 声明为 volatile
}
public class Thread3 {// ... 其他代码保持不变 ...
}

 使用volatile后

  1. 内存可见性volatile关键字确保了对volatile变量的写操作对其他线程总是可见的。当t2线程更新counter.flag的值时,这个更新会立即对其他线程(如t1线程)可见。这意味着t1线程在检查counter.flag的值时,将总是看到t2线程所做的最新更新。
  2. 禁止指令重排序volatile关键字还禁止了一些可能导致数据竞争的重排序。具体来说,它确保了写volatile变量之前的所有读写操作不会被重排序到写操作之后,同时确保了读volatile变量之后的所有读写操作不会被重排序到读操作之前。这确保了t2线程中的读取输入和更新flag的操作不会被重新排序,从而避免了数据竞争和不一致的行为。

因此,如果将Counter类中的flag字段声明为volatile,那么t1线程将能够正确地看到t2线程对flag的更新,并且不会因为指令重排序而导致数据竞争或不一致的行为。

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

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

相关文章

QT creator与VS2019 QT加载模块方法

QT creator与VS2019加载模块方法 QT creator,pro文件添加 VS2019 QT

酷克数据亮相第13届PostgreSQL中国技术大会,获数据库杰出贡献奖

7 月 12 日,第 13 届 PostgreSQL 中国技术大会在杭州盛大开幕。本次大会以“聚焦云端创新,汇聚智慧共享”为主题,邀请了国内外 PG 领域众多行业大咖、学术精英及技术专家,共同探讨数据库领域的发展趋势、技术创新和实践经验。酷克…

每天一个数据分析题(四百二十六)- 总体方差

为了比较两个总体方差,我们通常检验两个总体的() A. 方差差 B. 方差比 C. 方差乘积 D. 方差和 数据分析认证考试介绍:点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据分析专项练习题库 内容涵盖Python,SQL,统计学&a…

[Vulnhub] Tr0ll3 aircrack-ng+lynx

信息收集 IP AddressOpening Ports192.168.101.147TCP:22 $ ssh start192.168.101.147 用户:Start startTr0ll3:~$ find / -type f -perm 0777 2>/tmp/1 startTr0ll3:~$ cat /var/log/.dist-manage/wytshadow.cap | nc 192.168.101.128 10035 WIFI握手包 aircrack-ng 破…

mysql快速精通(四)多表查询

主打一个实用 一. 连接查询 交叉连接 交叉连接返回两个表的笛卡尔积,即每个表的每一行与另一个表的每一行组合 语法: SELECT *FROM table1 CROSS JOIN table2;内连接 查询两张表都存在的数据,即排除两张表的未匹配部分 语法: SELECT 字段名 FROM 左表 IN…

记一次 .NET某上位视觉程序 离奇崩溃分析

一:背景 1. 讲故事 前段时间有位朋友找到我,说他们有一个崩溃的dump让我帮忙看下怎么回事,确实有太多的人在网上找各种故障分析最后联系到了我,还好我一直都是免费分析,不收取任何费用,造福社区。 话不多…

JMESPath: 强大的处理JSON数据

文章目录 引言官网链接JMESPath原理概述工作原理 基础使用安装与配置基本查询过滤 高级使用投影管道表达式多选表达式 结论 引言 在处理JSON数据时,我们经常需要查询、过滤和转换数据。JMESPath(JSON Matching Expressions Path)是一种查询语…

[译] Rust标准库有些特殊,让我们改它

本篇是对 RustConf 2023中的The standard library is special. Let’s change that.这一视频的翻译与整理, 过程中为符合中文惯用表达有适当删改, 版权归原作者所有. 今天我将讨论Rust的标准库,更具体地说,是关于标准库有何特殊之处,以及为什么我们应该改变这一点。首先声明一下…

大模型高效参数微调技术

文章目录 一、Fine-Tuning:微调二、Prompt-Tuning:提示调优2.1 工作原理2.2 PET (Pattern-Exploiting Training)2.3 Prompt-Tuning集成2.4 模板构建方式 三、Prefix Tuning:连续提示模板3.1 提出动机3.2 工作原理 四、P-Tuning V1/V24.1 P-Tu…

MQTT——Mosquitto使用(Linux订阅者+Win发布者)

前提:WSL(Ubuntu22)作为订阅者,本机Win10作为发布者。 1、Linux安装Mosquitto 命令行安装。 sudo apt-get install mosquitto 以上默认只安装了mosquitto的服务,不带测试客户端工具mosquitto_sub和mosquitto_pub。如…

楼栋管理助你打造智慧校园寝室新时代

在聚焦于智慧校园寝室管理的楼栋管理功能上,核心目标是实现对宿舍楼本身的高效、精细化运营。这一功能围绕楼栋信息维护、空间优化、安全监管等方面展开,旨在为学生创造一个安全、舒适的生活环境,同时提升管理效率。 楼栋管理功能首先建立在全…

Run LoongArch64 Alpine VM on x86_64

一、Build from source(build on x86_64) Obtain the latest libvirt, virt-manager, and qemu source code, compile and install them. 1.1 Build libvirt from source sudo apt-get update sudo apt-get install augeas-tools bash-completion debhelper-compat dh-apparm…

防火墙NAT实验(接上一个用认证实验)

目录 一、拓扑图 二、实验需求 三、实验步骤 需求1:办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) 策略1:电信链路,多对多NAT,保留IP地址 测试策略1 策略2&#x…

2024年上半年信息系统项目管理师——综合知识真题题目及答案(第1批次)(4)

2024年上半年信息系统项目管理师 ——综合知识真题题目及答案(第1批次)(4) 第61题:The project manager should use (tool for the purpose to report on the work remaining for projects. A. cumulativ…

C# 中使用模式匹配 备忘

模式匹配# 要使用模式匹配,首先要了解什么是模式。在使用正则表达式匹配字符串时,正则表达式自己就是一个模式,而对字符串使用这段正则表达式进行匹配的过程就是模式匹配。而在代码中也是同样的,我们对对象采用某种模式进行匹配的…

内容协商源码解析与自定义 MessageConverter

目录 内容协商 1、引入xml依赖 2、postman分别测试返回json和xml 3、开启浏览器参数方式内容协商功能 4、内容协商原理 5、自定义 MessageConverter 综上 内容协商 根据客户端接收能力不同,返回不同媒体类型的数据。 若客户端无法解析服务端返回的内容&#…

keil5新建stm32工程的基本

1、建立工程文件夹,keil中新建工程,选择型号; 2、工程文件夹里建立自己所需要的文件夹等,复制固件库里面的文件到工程文件夹里; 3、将工程里建立对应的同名的分组,并将文件夹内的文件添加到工程分组中。 点…

Windows11终端winget配置

一、工具安装 Windows11是自带该工具的,如果wind10,可以找应用商店和GitHub上进行下载。 安装地址使用 winget 工具安装和管理应用程序 | Microsoft Learn 发布地址 Releases microsoft/terminal GitHub 二、无法使用问题排错 在命令行界面出现以…

CDN技术

CDN 假设你做了一个系统,要存放用户的一些信息,一般会把这些数据存放到MySQL当中,假设系统中有一些商品信息也是存放在MySQL中,慢慢的你的系统一天系统用户原来越多,查看商品的用户越来越多导致系统的响应速度越来越慢…

Go bufio包

bufio包: 带缓冲的I/O操作, 减少系统调用次数, 读取文件、网络数据。 bufio包 是什么 bufio 包是 Go 标准库中的一个非常有用的包,用于提供带缓冲的 I/O 操作。它通过缓冲来提高读取和写入的效率,可以有效减少系统调用…