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

AtomicReference 和 volatile 的比较

        AtomicReference 和 volatile 都是 Java 中用于处理多线程环境下变量可见性和原子性的机制,但它们在功能和使用场景上有重要区别。

volatile 关键字

特点:

  1. 保证变量的可见性:一个线程对 volatile 变量的修改会立即对其他线程可见

  2. 禁止指令重排序:防止 JVM 和处理器对指令进行重排序优化

  3. 不保证原子性:对 volatile 变量的复合操作(如 i++)不是原子性的

适用场景:

  • 简单的标志位(boolean 状态标志)

  • 单线程写,多线程读的场景

  • 对变量的操作本身就是原子性的情况

示例:

private volatile boolean flag = false;public void setFlag() {flag = true;
}public boolean isFlagSet() {return flag;
}

AtomicReference 类

特点:

  1. 提供原子性的引用更新操作

  2. 内部使用 CAS (Compare-And-Swap) 操作保证原子性

  3. 可以用于构建更复杂的无锁算法

  4. 提供了丰富的原子操作方法(如 compareAndSet, getAndSet 等)

适用场景:

  • 需要原子性地更新对象引用

  • 需要实现无锁(lock-free)算法

  • 需要保证复合操作的原子性

示例:

private final AtomicReference<String> ref = new AtomicReference<>("Initial");public void updateValue(String newValue) {String oldValue = ref.get();while (!ref.compareAndSet(oldValue, newValue)) {oldValue = ref.get();}}
 

主要区别

特性volatileAtomicReference
可见性保证保证
原子性不保证复合操作保证引用更新的原子性
复合操作不支持支持(如 compareAndSet)
性能较高略低(因 CAS 操作)
使用场景简单状态标志复杂原子操作
内存屏障读写都有内存屏障通过 Unsafe 类实现内存语义

如何选择

  • 如果只需要保证变量的可见性,使用 volatile

  • 如果需要原子性地更新对象引用或实现更复杂的原子操作,使用 AtomicReference

  • 在高度竞争的环境下,volatile 性能可能更好,但功能有限

  • 需要无锁编程时,AtomicReference 是更好的选择

http://www.xdnf.cn/news/537985.html

相关文章:

  • C++--综合应用-演讲比赛项目
  • 让数据驱动增长更简单! ClkLog用户行为分析系统正式入驻GitCode
  • 【随手记】 Event Bus vs. Event Loop
  • 01、java方法
  • 【Python训练营打卡】day30 @浙大疏锦行
  • 盲盒APP开发——解锁盲盒经济无限可能
  • mapbox-gl强制请求需要accessToken的问题
  • Chromium 回调设计实战:BindOnce 与 BindRepeating 的最佳实践
  • 【css】【面试提问】css经典问题总结
  • Golang中的runtime.LockOSThread 和 runtime.UnlockOSThread
  • 嵌入式自学第二十四天
  • 整数的个数
  • Ollama 如何在显存资源有限的情况下合理分配给不同的服务?
  • 理解前端工程化
  • 新书速览|鸿蒙HarmonyOS NEXT开发之路 卷2:从入门到应用篇
  • java集成mqtt
  • 停等协议(Stop-and-Wait Protocol)
  • AI人工智能写作平台:AnKo助力内容创作变革!
  • 铅铋环境下应力腐蚀的疲劳试验装置
  • 什么业务需要用到waf
  • 20. 自动化测试框架开发之Excel配置文件的IO开发
  • 【monai 教程】transform之CropPad详解
  • 磁流体 磁性流体 磁液
  • 封装一个基于 WangEditor 的富文本编辑器组件(Vue 3 + TypeScript 实战)
  • UEFI Spec 学习笔记---33 - Human Interface Infrastructure Overview---33.2.6 Strings
  • Oracle 中 open_cursors 参数详解:原理、配置与性能测试
  • 一键无损批量压缩图片 保留高清细节 开源免费!支持 10 + 格式转换
  • HashMap 的特点及应用场景
  • GraphQL 接口设计
  • SRS流媒体服务器(6)源码分析之推流篇