news 2026/4/18 7:37:08

AtomicInteger实现安全减库存

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AtomicInteger实现安全减库存

文章目录

        • 安全库存类
        • 任意main方法里面调用
        • 使用说明
        • 并发情况下如何多节点执行

并发问题一直是个小难点,自动有了AtomicInteger类,一切都变得简单了。
安全库存类

这个类支持几种减库存的方法,挺好的。

代码:

publicclassSafeInventory{privatefinalAtomicIntegerstock;privatefinalAtomicIntegertotalSales=newAtomicInteger(0);publicSafeInventory(intinitialStock){this.stock=newAtomicInteger(initialStock);}/** * 扣减库存 - 方法1:使用 compareAndSet (CAS) * 适合复杂的扣减逻辑 */publicbooleandeductWithCAS(intquantity){while(true){intcurrent=stock.get();if(current<quantity){returnfalse;// 库存不足}intnewValue=current-quantity;if(stock.compareAndSet(current,newValue)){totalSales.addAndGet(quantity);returntrue;}// CAS失败,循环重试}}/** * 扣减库存 - 方法2:使用 decrementAndGet * 适合每次扣减1个的情况 */publicbooleandeductOne(){while(true){intcurrent=stock.get();if(current<=0){returnfalse;// 库存不足}if(stock.compareAndSet(current,current-1)){totalSales.incrementAndGet();returntrue;}// CAS失败,重试}}/** * 扣减库存 - 方法3:更优雅的实现 */publicbooleandeduct(intquantity){intcurrent,newValue;do{current=stock.get();if(current<quantity){returnfalse;}newValue=current-quantity;}while(!stock.compareAndSet(current,newValue));totalSales.addAndGet(quantity);returntrue;}publicintgetStock(){returnstock.get();}publicintgetTotalSales(){returntotalSales.get();}}
任意main方法里面调用

代码:

publicstaticvoidmain(String[]args)throwsException{intthreadCount=200;intinitialStock=100;SafeInventoryinventory=newSafeInventory(initialStock);CountDownLatchlatch=newCountDownLatch(threadCount);ExecutorServiceexecutor=Executors.newFixedThreadPool(threadCount);System.out.println("使用 AtomicInteger 解决方案");System.out.println("初始库存: "+initialStock);System.out.println("并发线程数: "+threadCount);// 记录成功购买的线程数AtomicIntegersuccessCount=newAtomicInteger(0);for(inti=0;i<threadCount;i++){finalintuserId=i;executor.submit(()->{try{// 模拟网络延迟Thread.sleep(ThreadLocalRandom.current().nextInt(10,30));// 尝试购买if(inventory.deductOne()){successCount.incrementAndGet();System.out.println("用户"+userId+" 购买成功,剩余库存: "+inventory.getStock());}else{System.out.println("用户"+userId+" 库存不足");}}catch(InterruptedExceptione){Thread.currentThread().interrupt();}finally{latch.countDown();}});}latch.await();executor.shutdown();System.out.println("\n========== 最终统计 ==========");System.out.println("成功购买人数: "+successCount.get());System.out.println("最终库存: "+inventory.getStock());System.out.println("总销售量: "+inventory.getTotalSales());// 验证正确性if(inventory.getStock()==initialStock-successCount.get()&&inventory.getStock()>=0){System.out.println("✓ 库存扣减正确!");}else{System.out.println("✗ 库存扣减错误!");}}
使用说明

不同的商品可以分别创建SafeInventory对象,表示每个商品有各自的库存值
根据实际需要在线程主体里调用对应的减库存方法(减一个,或减多个等)

并发情况下如何多节点执行

可以用redis锁实现一个节点执行,每波并发只在一个节点执行,待并发完成,库存写库后下次再根据redis分配节点。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 0:02:34

数字员工与熊猫智汇是什么?主要具备哪些智能化特性?

数字员工通过应用AI销冠系统&#xff0c;显著优化了企业的业务流程&#xff0c;从而实现了成本降低和效率提升。首先&#xff0c;数字员工能够自动化处理大量客户沟通任务&#xff0c;通过高效的自动外呼功能&#xff0c;使得公司能够在短时间内完成大规模的客户联系&#xff0…

作者头像 李华
网站建设 2026/4/9 19:49:23

蓝牙产品做KC认证的流程是怎样的?

蓝牙产品属于带无线通信功能的电子设备&#xff0c;申请 KC 认证需结合韩国 RRA&#xff08;无线电研究所&#xff09;的射频合规要求&#xff0c;还需区分强制认证&#xff08;高风险如带电池的蓝牙耳机&#xff09;和自律认证&#xff08;低风险如无电池蓝牙配件&#xff09;…

作者头像 李华
网站建设 2026/4/16 11:10:20

Python大数据基于深度学习的蘑菇种类识别系统的设计与实现_9u10883y_论文

文章目录系统截图项目简介大数据系统开发流程主要运用技术介绍爬虫核心代码展示结论源码文档获取定制开发/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统截图 Python_9u10883y_ 论文大数据基于深度学习的蘑菇种类识别系统的设计与实现 …

作者头像 李华
网站建设 2026/4/16 2:16:01

Python大数据基于深度学习的饮食计划推荐与交流分享平台_j6yqgmwm--论文

文章目录系统截图项目简介大数据系统开发流程主要运用技术介绍爬虫核心代码展示结论源码文档获取定制开发/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统截图 Python大数据基于深度学习的饮食计划推荐与交流分享平台_j6yqgmwm–论文 项…

作者头像 李华
网站建设 2026/4/16 5:14:01

时间片轮询框架

单片机裸机常常会使用时间篇轮询框架&#xff0c;类似RTOS。参考AI&#xff0c;记录下时间片轮询 1.创建task结构体 typedef struct {uint8_t run; // 任务运行标志uint16_t timer; // 任务计时器uint16_t interval; // 任务执行间隔&a…

作者头像 李华