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

volatile 关键字的使用

volatile 关键字的使用

  • 1、标志位
  • 2、传递不依赖当前值的变量
  • 3、双重检查锁定(简化)
  • 4、注意事项


💖The Begin💖点点关注,收藏不迷路💖

volatile 关键字用于确保变量在多线程环境中的可见性和禁止指令重排序,但它不能保证操作的原子性。以下是volatile的几个使用场景:

1、标志位

当线程需要等待某个条件成立才能继续执行时,可以使用volatile修饰的布尔变量作为标志位。

volatile boolean initialized = false;  // 初始化线程  
Thread initializer = new Thread(() -> {  // 初始化资源  initialized = true;  
});  // 等待线程  
Thread waiter = new Thread(() -> {  while (!initialized) {  // 等待初始化完成  }  // 执行后续操作  
});  initializer.start();  
waiter.start();

2、传递不依赖当前值的变量

当变量的值被更新,且更新操作不依赖于其当前值时,volatile可确保更新立即对其他线程可见。例如,一个简单的计数器,每个线程只是简单地增加计数器的值,而不需要读取当前计数器的值作为计算的一部分。

3、双重检查锁定(简化)

在单例模式的双重检查锁定实现中,volatile确保单例对象在所有线程中的可见性。

public class Singleton {  private static volatile Singleton instance;  private Singleton() {}  public static Singleton getInstance() {  if (instance == null) {  synchronized (Singleton.class) {  if (instance == null) {  instance = new Singleton();  }  }  }  return instance;  }  
}

4、注意事项

1、不能保证原子性:如果操作包含多个步骤,如 i++,那么 volatile 关键字无法确保这些步骤的原子性。在这种情况下,应该使用 synchronized 或其他并发工具(如 AtomicInteger)。

2、内存屏障:volatile 的使用可能会引入内存屏障,这会增加一些性能开销,但通常这种开销远低于 synchronized。
在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 贪心系列专题篇四
  • pikachu文件下载
  • 详解爬虫使用代理ip的几种方案
  • 【GCC】结合GPT4 延迟梯度学习:公式推导及理论分析
  • 学习记录(11):训练图片分类的算法
  • 【linux】企业级linux内核优化方案,助你构建出高效、稳定且安全的Linux系统环境
  • MySQL深分页和浅分页
  • JVM详解(个人学习笔记)
  • 基于FPGA的数字信号处理(18)--半加器和全加器
  • 嵌入式网络调试命令 ifconfig 介绍及使用方法
  • 【五大海内外高校支持】2024年数字经济与计算机科学国际学术会议(DECS2024)
  • 壁纸头像小程序uniapp版(附源码)
  • YOLOv8新版本支持实时检测Transformer(RT-DETR)、SAM分割一切
  • nginx 代理 mysql 连接
  • 关于Redis的面试题
  • [译]CSS 居中(Center)方法大合集
  • 30天自制操作系统-2
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Docker: 容器互访的三种方式
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JS笔记四:作用域、变量(函数)提升
  • leetcode46 Permutation 排列组合
  • Linux Process Manage
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Map集合、散列表、红黑树介绍
  • node.js
  • node学习系列之简单文件上传
  • October CMS - 快速入门 9 Images And Galleries
  • Vue 重置组件到初始状态
  • VuePress 静态网站生成
  • 阿里云应用高可用服务公测发布
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 浅谈web中前端模板引擎的使用
  • 数据可视化之 Sankey 桑基图的实现
  • 我的业余项目总结
  • 新版博客前端前瞻
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​linux启动进程的方式
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #pragma once与条件编译
  • #考研#计算机文化知识1(局域网及网络互联)
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (void) (_x == _y)的作用
  • (六)Flink 窗口计算
  • (十)Flink Table API 和 SQL 基本概念
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (算法二)滑动窗口
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (一)Java算法:二分查找
  • (一)Neo4j下载安装以及初次使用
  • (一)VirtualBox安装增强功能