前言
默认的加锁逻辑是非公平的。
在加锁失败时,线程会进入 while 循环,一直尝试获得锁,这时候是多线程进行竞争。就是说谁抢到就是谁的。
Redisson 提供了 公平锁 机制,使用方式如下:
RLock fairLock = redisson.getFairLock("anyLock");
// 最常见的使用方法
fairLock.lock();
下面一起看下公平锁是如何实现的?
公平锁
直接定位到源码方法:RedissonFairLock#tryLockInnerAsync
。
好家伙,这一大块代码,我截图也截不完,咱们直接分析 lua 脚本。
PS:虽然咱不懂 lua,但是这一堆堆的 if else 咱们大概还是能看懂的。
因为 debug 发现 command == RedisCommands.EVAL_LONG
,所以直接看下面一部分。
这么长,连呼好几声好家伙!
先来看看参数都有啥?
- KEYS[1]:加锁的名字,
anyLock
; - KEYS[2]:加锁等待队列,
redisson_lock_queue:{anyLock}
; - KEYS[3]:等