java中redisson实现分布式锁的核心三步是:获取rlock对象、调用lock()加锁、业务完成后unlock()释放;它自动封装原子性、可重入、续期及线程校验,无需手写lua脚本。

Java 中用 Redisson 实现分布式锁加锁,核心就三步:获取锁对象、调用 lock() 方法、执行完业务后 unlock()。它把底层复杂的原子性、可重入、续期、线程校验等全封装好了,你不用手写 Lua 脚本或处理超时误删。
怎么获取锁对象
通过 RedissonClient 实例调用 getLock(),传入唯一锁名(建议带业务标识,比如 "lock:order:1001"):
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
RLock lock = redissonClient.getLock("lock:goods:" + goodsId);
这个 lock 是一个可重入的分布式锁对象,内部自动绑定当前线程 ID 和唯一请求标识,后续所有操作都基于它。
加锁的两种常用方式
不指定过期时间(推荐初用):
调用 lock.lock();
→ Redisson 默认使用 30 秒过期时间,并自动开启“看门狗”机制;
→ 每隔 10 秒检查锁是否还被当前线程持有,是则续期到 30 秒;
→ 只要业务没结束、客户端没关闭,锁就不会意外过期。
指定固定过期时间(适合确定耗时场景):
调用 lock.lock(20, TimeUnit.SECONDS);
→ 锁 20 秒后自动释放,不再续期;
→ 不需要手动 unlock,但要注意:若业务超时,锁提前释放,可能引发并发问题;
→ 此时若手动 unlock,Redisson 会校验是否为加锁线程,不是则抛异常,防止误删。
加锁过程的关键保障
- 原子性:底层用 Lua 脚本执行 SET key value NX PX,加锁和设过期一步到位
- 线程安全:value 值由 UUID + 线程 ID 组成,解锁时严格比对,只允许加锁线程释放
- 可重入:同一线程重复 lock(),内部计数器 +1;对应次数 unlock() 后才真正释放
- 阻塞等待:如果锁被占,线程会订阅 Redis 的 pub/sub 通道,等锁释放通知后再抢,不忙等
实际使用的小提醒
务必在 try-finally 或 try-with-resources 中调用 unlock(),避免因异常导致锁未释放;
锁 key 尽量细化粒度(如按商品 ID、用户 ID),别用全局一把锁;
生产环境建议用 Redis 集群或哨兵模式配置 RedissonClient,提升可用性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










