news 2026/6/15 17:52:06

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/6/15 11:47:26

等保测评全流程实操手册:从自查到验收,一步不踩坑

2025年3月20日起&#xff0c;新版《网络安全等级测评报告模板》正式启用&#xff0c;标志着等保测评进入“精准防控”新阶段。对企业而言&#xff0c;合规不再是简单满足条款&#xff0c;而是要应对云原生、物联网等新增场景的防护要求&#xff0c;这让不少运维人员在测评中频频…

作者头像 李华
网站建设 2026/6/15 14:36:02

第十七篇:Day49-51 前端工程化进阶——从“手动”到“自动化”(对标职场“提效降本”需求)

一、前置认知&#xff1a;前端工程化的核心价值与职场痛点 在掌握性能优化和安全防护能力后&#xff0c;我们能打造“快、稳、安”的产品&#xff0c;但当面对“团队10人协作开发”“每日3次版本迭代”“多环境部署”等职场场景时&#xff0c;手动复制文件、人工测试、线下传输…

作者头像 李华
网站建设 2026/6/15 11:50:39

[GFCTF 2021]where_is_shell

第一次打CTF——PWN篇学习笔记16 在ida中看一看&#xff0c;发现可疑地址 int __fastcall main(int argc, const char **argv, const char **envp) {_BYTE buf[16]; // [rsp0h] [rbp-10h] BYREF ​system("echo zltt lost his shell, can you find it?");read(0, …

作者头像 李华
网站建设 2026/6/15 12:54:05

Python大数据基于数据挖掘的高考志愿推荐系统的设计与实现_3ri592gf_论文

文章目录系统截图项目简介大数据系统开发流程主要运用技术介绍爬虫核心代码展示结论源码文档获取定制开发/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统截图 Py 大数据基于数据挖掘的高考志愿推荐系统的设计与实现 项目简介 本次研究将…

作者头像 李华
网站建设 2026/6/14 20:03:44

不被代码包围,你就不知道什么是服务器端信息测试!

本章节主要讲解“软件测试的服务器端信息测试”服务器端信息测试主要是从服务器对客户端开发的信息角度来测试服务器被攻击的可能性&#xff0c;以及被攻击的难易程度。主要需要测试以下几方面的信息&#xff1a;服务器允许运行账号权限测试。Web 服务器端口测试。Web 服务器版…

作者头像 李华
网站建设 2026/6/14 14:22:39

震惊!2026年AI Agent将颠覆程序员工作?三大巨头揭秘:多模态+执行能力才是王道,代码生成效率提升3-5倍!

“每个人每天使用最高频的三个APP中有两个是Agent时&#xff0c;才意味着AI Agent进入新发展阶段。” “一个好Agent的衡量指标&#xff0c;包括可控性、可解释性以及持续稳定执行任务的能力。” “多数Agent存在负毛利问题&#xff0c;完成任务的代价高于用户支付意愿&#…

作者头像 李华