redisson分布式锁 - 非公平锁
2021-06-29 22:46:53 3 举报
redisson分布式锁 - 非公平锁加锁流程
作者其他创作
大纲/内容
是
加锁成功break跳出
RLock lock = singleRedissonClient.getLock(lockKey);
执行第一个if逻辑,返回nil
之前加锁的线程是否跟当前是同一个线程
代表加锁成功直接return
已不超时的方式获取latchgetEntry(threadId).getLatch().acquire();
否
lock.lock()
走第二个if逻辑,给hash的value递增1,同时更新锁过期时间
scheduleExpirationRenewal(threadId);
org.redisson.RedissonLock#scheduleExpirationRenewal
加锁脚本返回nil
ttl>=0
然后添加一个FutureListener,续期成功后延迟 internalLockLeaseTime / 3 时间再次调度自己,internalLockLeaseTime为加锁时间(30s)// reschedule itself scheduleExpirationRenewal(threadId)
代表加锁不指定加锁时长执行逻辑跟非-1的情况一致,唯一区别是成功获取到锁后,会使用watch dog方式开启一个TimerTask对锁过期时间定时进行续期 初始加锁时长为30s,每过10s定时续期为30s
leaseTime是否为-1
org.redisson.RedissonLock#lockInterruptibly()
直接调用org.redisson.RedissonLock#tryLockInnerAsync 执行加锁lua脚本后,加锁成功返回null(加锁不成功返回当前锁的存活时间)
返回当前锁的存活时间
阻塞结束重新进入while
构建一个lock对象
ttl为null
订阅当前线程id RFuture<RedissonLockEntry> future = subscribe(threadId);
lockKey是否已存在
0 条评论
回复 删除
下一页