Redisson 源码解析--非公平锁
2021-04-12 13:40:18 0 举报
Redisson 源码解析--非公平锁
作者其他创作
大纲/内容
test 是否存在redis中
false未获取到锁
getEntry(threadId).getLatch() == Semaphore
redisLock.lock()
RedissonLock
设置 test 的有效期 30S
加锁失败
如果哈希表中key含有给定字段,返回 1
设置锁的有效期
commandExecutor =CommandAsyncExecutorid = UUIDinternalLockLeaseTime : 获取看门狗得超时时间,默认30s
说明test已经被人所持有
核心思想:while 循环加锁的时候的时候,尝试while的时候,会先判断一下获取锁的时间是否已经超时,如果超过了时间,就不再进行拿锁。
RLock redisLock = redissonClient.getLock(\"test\")
设置了有效期的是没有看门狗进行续时的
解锁
如果返回的加锁时间 大于 0,说明锁还未释放
返回
true获取锁
重置 test 的有效期 30S
1
尝试加锁 span style=\"font-size: inherit;\
返回当前锁持有的剩余时间
获取线程idThread.currentThread().getId()
ttl == null
设置 test 中的hashMap结构key:UUID:threadId --- value:1test :{“UUID: 1” : 1 }
当释放锁的时候,会对这个key发送广播消息
Long ttl
未设置锁的有效期
internalLockLeaseTime / 3默认 30 /3 = 10 秒执行
重入
semaphore.acquire(),获取信号量,没信号量可用时,将进行阻塞semaphore.release(); 释放信号量
小于 0, 说明ttl = -1 ,此锁没有有效期
//如果获取失败,则需要订阅到对应这个锁的channel来及时被唤醒重新尝试抢锁RFuture<RedissonLockEntry> future = subscribe(threadId);//subscribe方法返回的是异步结果Future,通过commandExecutor来同步commandExecutor.syncSubscription(future);font color=\"#a1a1a1\
失败
否
addListener 添加一个监听
leaseTime! = -1
这边的while 结束之后,会有一个unsubscribe 方法 ,里面会release
2
!future.isSuccess()
是
return nil
ttl > 0
super
获取 test :{“UUID: 1” : 1 }对里面的value进行 +1
KEYS[1] : testARGV[1]: 30000ARGV[2]: 7d45773b-6275-4d8c-9ae5-0c81ac3b2517: 1
tryLockInnerAsync
codec = JsonJacksonCodecname = testcommandExecutor =CommandAsyncExecutor
加锁成功
while(true) 循环加锁
成功,循环调用
说明当前test锁被人持有,而且,不是自身线程
后面会有监听看门狗续时
scheduleExpirationRenewal
lock 和 tryLock 区别lock会一直等待获取锁,而tryLock只会尝试一次加锁
getLock(“test”)
time -= (System.currentTimeMillis() - currentTime); if (time <= 0) { acquireFailed(threadId); return false; }
其实就是判断是否是当前线程持有锁
锁的释放,会进行消息的发布,然后还会进行信号量的-- ,那些订阅了消息的线程应该就会唤醒,然后执行while的逻辑
订阅keyredisson_lock__channel:{test}
// KEYS[1] 锁的名称 test// KEYS[2] 频道名称 redisson_lock__channel:{test}// ARGV[1] 释放锁的消息 0// ARGV[2] 锁释放时间30000// ARGV[3] 线程名称 a6270ff2-4c0e-43c3-b4b4-76e754f017bd:1
acquire()获取信号量,没信号量可用时,将进行阻塞,释放信号量之后,这边会执行
0 条评论
下一页