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

并发-原子变量类

        在多线程环境中,如果多个线程对共享资源同时进行操作的话,很容易出现数据不一致的情况(如并发环境同时对库存扣除,导致余额不对),通常情况下我们会使用synchronized或者Lock同步方式来保证线程安全。

        示例:对库存余额不加锁,导致余额出错。商品库存总共100,模拟了100个线程扣减库存,线程执行完后,库存余额应该为0,实际并不是,见下方示例代码。

package com.gingko.thread;
//商品信息类
public class Product {private String productName;private int inventory;//库存public Product(String productName,int inventory ) {this.productName = productName;this.inventory = inventory;}//扣减库存public void deduction() {this.inventory--;}public int getInventory() {return inventory;}
}
package com.gingko.thread;
import java.util.ArrayList;
import java.util.List;public class MultiThread {public static void main(String[] args) {Product product = new Product("iphone",100);List<Thread> threads = new ArrayList<>();for (int i = 0; i < 100; i++) {Thread thread = new Thread(() -> {try {Thread.sleep(50);//模拟扣库存时间} catch (InterruptedException e) {e.printStackTrace();}product.deduction();});threads.add(thread);}//批量开启线程for (Thread t:threads) {t.start();}//等待线程结束查看库存余额for (Thread t:threads) {try {t.join();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("库存余额是:" + product.getInventory());}
}

        运行结果如下:

       

        为了保证业务的准确性,以下2种方式都可以实现。

        方式1:扣减库存方法加锁:

        运行结果如下,符合预期。

        方式2:通过原子变量修饰库存,使其满足线程安全

        运行结果如下,符合预期。 

        synchronized和Atomic方式比较:

        Atomic类由于使用了底层的CAS操作,通常比synchronized关键字具有更好的性能。在高并发环境下,Atomic类可以更好地支持多线程的并发操作。

        synchronized关键字由于涉及到锁的获取和释放,可能会引入较大的性能开销。在某些情况下,使用synchronized可能会导致性能瓶颈。

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

相关文章:

  • 【MCU控制 初级手札】1.1 电阻
  • 现代CSS实战:用变量与嵌套重构可维护的前端样式
  • 使用 Java 获取 PDF 页面信息(页数、尺寸、旋转角度、方向、标签与边框)
  • Flink双流实时对账
  • 大语言模型零样本情感分析实战:无需机器学习训练,96%准确率实现指南
  • 云手机隐私保护指南:如何保障账号与数据的云端安全?
  • 虚拟机删除操作
  • IELTS 阅读C15-test1-passage 2 复盘
  • React源码6 三大核心模块之一:commit, finishConcurrentRender函数
  • 24.找到列表中最大或最小值的索引
  • Pitaya 是一个简单、快速、轻量级的游戏服务器框架,它为分布式多人游戏和服务器端应用程序提供了一个基本的开发框架
  • 优雅的Java:01.数据更新如何更优雅
  • Python学习之路(十二)-开发和优化处理大数据量接口
  • 从springcloud-gateway了解同步和异步,webflux webMvc、共享变量
  • S7-200 SMART PLC:不同CPU及数字量 IO 接线全解析
  • 构建强大的物联网架构所需了解的一切
  • Janitor AI重塑人机交互的沉浸式智能体验
  • 大型语言模型(LLM)的技术面试题
  • 【机器人】REGNav 具身导航 | 跨房间引导 | 图像目标导航 AAAI 2025
  • 【算法-BFS 解决最短路问题】探索BFS在图论中的应用:最短路径问题的高效解法
  • docker停止所有容器和删除所有镜像
  • 【Docker基础】Dockerfile指令速览:高级构建指令详解
  • 闲庭信步使用图像验证平台加速FPGA的开发:第十六课——图像五行缓存的FPGA实现
  • 常见的 Commit 描述 分类及示例
  • 2025-07-15通过边缘线检测图像里的主体有没有出血
  • 2025-07-15 李沐深度学习6——Softmax回归
  • 实测两款效率工具:驾考刷题和证件照处理的免费方案
  • vscode里面怎么配置ssh步骤
  • 算法学习笔记:22.贪心算法之霍夫曼编码 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
  • JavaScript进阶篇——第三章 箭头函数核心