当前位置: 首页 > article >正文

java 多线程中的volatile关键字作用

文章目录

  • 前置
  • 作用一:多线程下,保证可见性
  • 作用二:多线程下,禁止指令重排序

前置

保证可见性和保证没有指令重排导致的问题
但是不保证原子性

volatile 常常见到和 static 一起使用,因为 volatile 用在多线程中共享变量上
如果一个共享变量不是 static 这种类级别的共享变量,而是一个实例级别的共享变量上,那么不需要 static 直接 volatile 即可

作用一:多线程下,保证可见性

jvm 规定,每个线程有自己的工作内存(本地缓存),对变量的读写一般在自己的工作内存(本地缓存)中进行,如果一个线程修改了共享变量的值,其他线程可能无法立即看到最新的值,因为工作内存(本地缓存)还未被更新的原因

volatile 声明的变量,写操作时强制将变量的修改立即刷新到主内存;读操作时强制从主内存中读取变量的最新值,而不是本地缓存

作用二:多线程下,禁止指令重排序

假设我们有两个线程,线程A和线程B,它们分别执行以下代码

// 线程A
int a = 1;      // 操作1
flag = true;    // 操作2// 线程B
if (flag == true) {   // 操作3int b = a;        // 操作4System.out.println(b); // 输出结果
}

假设 A,B 线程同时执行,假设按照操作1 - 2 - 3 - 4 这样的操作顺序执行下来,线程B看到 flag == true 时,a 应该已经被赋值为 1,所以 b 的值是 1,输出 1

但是在没有给 flag 设置为 volatile 的情况下,编译器或处理器可能会对代码进行 指令重排序,比如交换操作1和操作2的顺序

// 线程A(被重排序后)
flag = true;    // 操作2 先执行
int a = 1;      // 操作1 后执行// 线程B
if (flag == true) {   // 操作3int b = a;        // 操作4System.out.println(b); // 输出结果
}

此时如果执行顺序是,操作 2 - 3 - 4 - 1,你会发现执行到操作 4 时,a 还没有被赋值呢,就会导致 b 的值被赋上了默认值 0 了

如果给 flag 加上了 volatile 可以保证指令不再重排序

private volatile boolean flag = false;
http://www.lryc.cn/news/2395644.html

相关文章:

  • ESP32基础知识1:项目工程建立和烧录
  • allWebPlugin中间件VLC专用版之录像功能介绍
  • Vim 支持多种编程语言编辑器
  • 解决 IDEA 在运行时中文乱码问题
  • Diffusion Planner:扩散模型重塑自动驾驶路径规划(ICLR‘25)
  • 华为OD机试真题——阿里巴巴找黄金宝箱 IV(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
  • 数据结构:时间复杂度(Time Complexity)和空间复杂度(Space Complexity)
  • CentOS7.9环境离线部署docker和docker-compose的两种方式
  • 北京大学肖臻老师《区块链技术与应用》公开课:06-BTC-网络
  • SSL/TLS 协议详解:安全通信的基石
  • 设计模式——外观设计模式(结构型)
  • Linux `vi/vim` 编辑器深度解析与高阶应用指南
  • ES中must与filter的区别
  • qt之开发大恒usb3.0相机三
  • Transformer架构详解:从Attention到ChatGPT
  • 数据中台(大数据平台)之数据安全管理
  • github双重验证密码忘记或者获取不了了怎么办
  • 告别复杂操作!电脑极简风格计时使用
  • stm32cube ide如何将工具链替换成arm-none-eabi-gcc
  • [STM32问题解决(2)]STM32通过串口与PC通信,打开串口助手后无法在打开状态下下载程序和复位STM32
  • RabbitMQ 与其他 MQ 的对比分析:Kafka/RocketMQ 选型指南(二)
  • OpenHarmony定制系统组合按键(一)
  • ORDER BY子句在一个 SQL 查询中只能出现一次
  • Spring Boot 3 整合 MQ 构建聊天消息存储系统
  • DeepSeek实战:打造智能数据分析与可视化系统
  • 非线性声学计算与强化学习融合框架:突破复杂环境人机交互的新技术
  • C++ - STL #什么是STL #STL的版本 #闭源开源 #STL的六大组件
  • Flutter - 原生交互 - 相机Camera - 01
  • 湖北理元理律师事务所:个人债务管理的温度与精度
  • Compose原理 - 整体架构与主流程