news 2026/2/9 8:54:14

Java中为什么volatile不能解决多写问题?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java中为什么volatile不能解决多写问题?

上述规约是一个关于Java并发编程的重要问题。本篇博文我来详细解释一下:

1.volatile的内存可见性

volatile的作用:

  • 保证可见性:当一个线程修改了volatile变量的值,新值会立即刷新到主内存,其他线程读取时会从主内存重新获取最新值
  • 禁止指令重排序:防止JVM的指令重排序优化

示例:

publicclassVolatileExample{privatevolatilebooleanflag=false;publicvoidwriter(){flag=true;// 写操作}publicvoidreader(){if(flag){// 读操作// 一定能看到最新值}}}

2.为什么volatile不能解决多写问题

publicclassCounter{privatevolatileintcount=0;// 多线程调用会有问题publicvoidincrement(){count++;// 不是原子操作:读→改→写}}

问题分析

线程A:读取count=0 线程B:读取count=0 线程A:count+1=1,写回 线程B:count+1=1,写回 // 结果应该是2,实际是1

3.解决方案对比

方案1:AtomicInteger

importjava.util.concurrent.atomic.AtomicInteger;publicclassAtomicExample{privateAtomicIntegercount=newAtomicInteger(0);publicvoidincrement(){count.incrementAndGet();// 原子操作}publicintget(){returncount.get();}}

原理:基于CAS(Compare And Swap)

publicfinalintincrementAndGet(){returnunsafe.getAndAddInt(this,valueOffset,1)+1;}// 实际是自旋CAS操作

方案2:LongAdder(JDK8+推荐)

importjava.util.concurrent.atomic.LongAdder;publicclassLongAdderExample{privateLongAddercount=newLongAdder();publicvoidincrement(){count.increment();// 性能更好}publiclongsum(){returncount.sum();}}

4.性能对比分析

特性AtomicLongLongAdder
原理CAS自旋分段CAS
高并发写性能一般优秀
读性能O(1)O(N)需要合并
内存占用较高
适用场景读写均衡写多读少

5.完整示例

importjava.util.concurrent.atomic.AtomicInteger;importjava.util.concurrent.atomic.LongAdder;importjava.util.concurrent.CountDownLatch;publicclassCounterComparison{// 方案1:volatile(不安全)privatevolatileintvolatileCount=0;// 方案2:AtomicIntegerprivateAtomicIntegeratomicCount=newAtomicInteger(0);// 方案3:LongAdder(JDK8+推荐)privateLongAdderadderCount=newLongAdder();publicvoidtestVolatile()throwsInterruptedException{CountDownLatchlatch=newCountDownLatch(100);for(inti=0;i<100;i++){newThread(()->{for(intj=0;j<1000;j++){volatileCount++;// 线程不安全}latch.countDown();}).start();}latch.await();System.out.println("Volatile结果(可能不正确): "+volatileCount);}publicvoidtestAtomic()throwsInterruptedException{CountDownLatchlatch=newCountDownLatch(100);for(inti=0;i<100;i++){newThread(()->{for(intj=0;j<1000;j++){atomicCount.incrementAndGet();}latch.countDown();}).start();}latch.await();System.out.println("AtomicInteger结果: "+atomicCount.get());}publicvoidtestLongAdder()throwsInterruptedException{CountDownLatchlatch=newCountDownLatch(100);for(inti=0;i<100;i++){newThread(()->{for(intj=0;j<1000;j++){adderCount.increment();}latch.countDown();}).start();}latch.await();System.out.println("LongAdder结果: "+adderCount.sum());}publicstaticvoidmain(String[]args)throwsInterruptedException{CounterComparisontest=newCounterComparison();test.testAtomic();test.testLongAdder();test.testVolatile();}}

6.使用建议

  1. 单写多读:使用volatile
  2. 低竞争环境:使用AtomicInteger/AtomicLong
  3. 高并发写场景:使用LongAdder(JDK8+)
  4. 精确统计场景:使用Atomic系列(LongAdder的sum()可能不是实时精确值)

总结

  • volatile只解决可见性问题,不解决原子性问题
  • 对于count++这类复合操作,必须使用原子类
  • 在JDK8+的高并发写场景下,LongAdder性能通常优于AtomicLong
  • 选择哪个工具取决于具体的读写比例和并发程度
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/3 5:21:44

2025研究生必备9个降AI率工具测评榜单

2025研究生必备9个降AI率工具测评榜单 2025研究生必备9个降AI率工具测评榜单 随着人工智能技术在学术领域的广泛应用&#xff0c;论文的AIGC检测标准也日益严格。2025年&#xff0c;许多研究生在撰写论文时发现&#xff0c;传统的降重方法已经难以满足最新的检测要求。不少学生…

作者头像 李华
网站建设 2026/2/8 23:15:46

LeetCode热题100--416. 分割等和子集--中等

题目 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#xff1a;true 解释&#xff1a;数组可以分割成 [1, 5, 5] 和 [11] 。 示…

作者头像 李华
网站建设 2026/2/4 12:19:07

Visual Studio 内存占用过高问题优化方案

Visual Studio 内存占用过高问题优化方案本人的版本为&#xff1a;Microsoft Visual Studio Community 2022对于 Visual Studio 内存占用过高的问题&#xff0c;通常可以从优化软件配置和管理扩展入手。以下是一些已验证有效的主流优化方法&#xff0c;按「见效快慢操作难易」的…

作者头像 李华
网站建设 2026/2/4 1:34:24

YOLO模型支持量化感知训练?更低GPU推理成本

YOLO模型支持量化感知训练&#xff1f;更低GPU推理成本 在智能制造工厂的质检线上&#xff0c;摄像头每秒捕捉数百帧PCB板图像&#xff0c;系统必须在毫秒级内完成缺陷检测并触发分拣动作。面对如此严苛的实时性要求&#xff0c;即便是高性能GPU也常常因显存溢出或延迟过高而“…

作者头像 李华
网站建设 2026/2/6 6:13:14

YOLO目标检测输出带置信度?GPU并行排序优化

YOLO目标检测输出带置信度&#xff1f;GPU并行排序优化 在工业质检流水线上&#xff0c;一台搭载YOLOv8的视觉系统正以每秒30帧的速度扫描PCB板。每一帧图像都会产生超过8000个候选框&#xff0c;而系统必须在33毫秒内完成从推理到输出的全过程——否则就会造成产线停顿。这样…

作者头像 李华
网站建设 2026/2/4 9:33:37

YOLO模型训练收敛慢?学习率预热+GPU加速验证

YOLO模型训练收敛慢&#xff1f;学习率预热GPU加速验证 在工业视觉系统日益复杂的今天&#xff0c;实时目标检测的稳定性与效率直接决定了产线良率、安防响应速度甚至自动驾驶的安全边界。YOLO系列作为单阶段检测器的标杆&#xff0c;凭借其“一次前向传播完成预测”的高效架构…

作者头像 李华