讲师中心 微信公众号
AI工具推荐 视频效率加速

Java 中锁机制怎么在编写高并发秒杀逻辑时避免锁住整个商品类而实现细粒度的库存行锁包装

星丽大大_4179

星丽大大_4179

发布时间:2026-07-26 13:07:07

|

936人浏览过

|

来源于php中文网

原创

高并发秒杀需将锁粒度下沉至商品ID级行锁,推荐优先用ConcurrentHashMap+CAS无锁扣减;中高并发可选分段锁;集群场景必须用Redis分布式锁+Lua脚本,再辅以数据库乐观锁和唯一约束兜底。

java 中锁机制怎么在编写高并发秒杀逻辑时避免锁住整个商品类而实现细粒度的库存行锁包装

在高并发秒杀场景中,不能对整个商品类(比如 Product 类或其 Service 实例)加锁,否则会严重串行化请求,失去并发意义。核心思路是:**把锁的粒度从“类/方法”下沉到“单个商品 ID 对应的库存记录”**,即实现基于商品 ID 的行级锁(逻辑行锁),而非数据库行锁本身(那属于持久层优化)。Java 中可通过多种方式模拟“细粒度库存行锁”,关键在于避免全局锁、减少锁竞争、保证原子性。

用 ConcurrentHashMap + CAS 实现无锁化库存扣减

这是最轻量、推荐优先尝试的方式。不显式加锁,而是依赖 ConcurrentHashMap 存储各商品的当前可售库存(或状态标记),结合 AtomicInteger 或 LongAdder 做原子扣减:

  • 初始化时为每个商品 ID 创建一个 AtomicInteger stock = new AtomicInteger(initStock),存入 ConcurrentHashMap<long atomicinteger></long>
  • 秒杀时调用 stock.compareAndSet(expected, expected - 1),仅当当前值等于预期值才扣减成功
  • 失败则重试或返回“库存不足”,无需阻塞等待
  • 适合库存量不大、热点商品不多的场景;若极端热点(如单商品每秒数万请求),CAS 失败率升高,需配合限流或降级

用分段锁(Lock Striping)按商品 ID 哈希分桶加锁

当需要更严格的顺序控制(例如要同步更新缓存+DB、或执行复杂校验逻辑),可将锁按商品 ID 分片,避免所有请求争抢同一把锁:

  • 预定义固定数量的锁对象数组,如 private final Lock[] locks = new ReentrantLock[64]
  • 根据商品 ID 计算哈希槽位:int idx = (int)(productId % locks.length),再对 locks[idx] 加锁
  • 同一商品 ID 总是落在同一个槽位,保证该商品的操作串行;不同商品大概率落在不同槽位,并发互不影响
  • 注意锁数组大小需合理(太小仍易冲突,太大浪费内存),建议取 2 的幂次便于取模优化

用 Redis 分布式锁 + Lua 脚本保障跨 JVM 库存一致性

单机锁无法解决集群部署下的并发问题。此时需借助 Redis 实现分布式“商品行锁”:

java-api-doc-generator
java-api-doc-generator

分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。

下载

立即学习“Java免费学习笔记(深入)”;

  • 锁 Key 设计为 seckill:lock:{productId},TTL 设置合理(如 5~10 秒),防止死锁
  • 使用 SET key value NX EX seconds 命令获取锁,value 为唯一请求标识(如 UUID)
  • 库存扣减逻辑用 Lua 脚本原子执行:先查 Redis 中剩余库存,大于 0 则 DECR 并返回结果,避免查-改非原子问题
  • 释放锁时严格校验 value 是否匹配,防止误删他人锁(可用 Redisson 的 RLock 封装简化)

数据库层面配合:乐观锁 + 唯一约束兜底

即使应用层做了细粒度锁,最终落库仍需防超卖。不能只靠 SELECT + UPDATE,而应:

  • 库存字段增加版本号(version)或时间戳,在 UPDATE 语句中校验:UPDATE item SET stock = stock - 1, version = version + 1 WHERE id = ? AND stock > 0 AND version = ?
  • 或直接用库存数值做条件:WHERE id = ? AND stock >= 1,并检查 updateCount == 1
  • 订单表加 UNIQUE(product_id, user_id) 约束,拦截同一用户重复下单(秒杀防刷)
  • 数据库唯一索引和乐观锁是最后一道防线,必须有,但不应作为主要并发控制手段

细粒度库存行锁的本质不是“锁住某行数据”,而是“让同一商品的所有并发请求排队执行”。Java 层可通过无锁原子操作、分段锁、分布式锁三种策略分级应对,再叠加数据库乐观锁与唯一约束,形成多层防护。选型取决于系统规模、一致性要求和运维成本——中小流量优先 CAS,中高并发用分段锁,全集群场景必须引入 Redis 锁+Lua 原子脚本。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

11597

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

8702

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

7492

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1224

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

988

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

1476

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

3049

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

20291

2023.08.03

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn