news 2026/5/9 21:52:27

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/5/9 4:31:21

mysql性能调优、连接数、问题排查等

文章目录查看连接数错误日志在哪里查看配置文件在哪里报错查看连接数 show status like %connect%; Aborted_connects 0 Connection_errors_accept 0 Connection_errors_internal 0 Connection_errors_max_connections 0 Connection_errors_peer_address 0 Connection_errors…

作者头像 李华
网站建设 2026/5/9 10:20:03

按需付费 vs 包年包月:云服务器计费模式怎么选更划算?

在云服务器选型中&#xff0c;计费模式的选择直接影响IT成本结构&#xff0c;不少开发者和企业会在按需付费与包年包月之间纠结。其实两种模式没有绝对优劣&#xff0c;核心是让计费逻辑匹配业务需求——看似简单的选择背后&#xff0c;藏着资源调度效率与成本优化的深层逻辑。…

作者头像 李华
网站建设 2026/5/3 15:04:18

Linux中如何查看用户所属组?

Linux是多用户多任务系统&#xff0c;用户组管理是系统权限控制的关键&#xff0c;明确用户所属组能避免权限混乱&#xff0c;保障操作安全。无论日常维护还是故障排查&#xff0c;查看用户所属组都是常用操作&#xff0c;那么如何在Linux中查看用户所属组?以下是具体内容介绍…

作者头像 李华
网站建设 2026/5/6 18:46:55

【自然语言处理】处理 GBK 编码汉字的算法设计

目录 一、引言 核心算法思路 二、处理 GBK 编码汉字的算法设计实现思路 &#xff08;一&#xff09;类整体定位 &#xff08;二&#xff09;核心方法逐行深度解析 1. encode&#xff1a;Unicode 字符串 → GBK 字节流 功能定义 参数详解 实现逻辑拆解 使用场景 2. de…

作者头像 李华