Lengxf_redisson加锁源码流程
2023-12-19 11:52:02 0 举报
redisson加锁源码流程
作者其他创作
大纲/内容
ExpirationEntry ent = EXPIRATION_RENEWAL_MAP.get(getEntryName());若已经无锁则不继续加锁
同时开启异步看门狗scheduleExpirationRenewal(threadId);
leaseTime > 0
renewExpiration();延时机制
lock.lock();执行加锁逻辑
整体流程与RedissonSpinLock思想是相同的;只不过中间通过发布/订阅模式;自旋过程中会使用信号量的方式,进行线程中断,让出CPU,防止CPU飙升
否则重新执行redis lua脚本renewExpirationAsync(threadId);如果存在则renewExpiration()续期;不存在则中断续期
若不成功则推送本线程锁信息pubSub.timeout(future);然后进入自旋请求锁
RedissonSpinLock非公平锁持续取不到锁会CPU上升
RedissonLock非公平锁发布订阅机制实现可以避免CPU上升
未拿到锁则进入自旋状态 自旋时间会每次时间增加通过Long nextSleepPeriod = backOffPolicy.getNextSleepPeriod();实现
当所有数据都获取到锁 本次加锁才记为成功
RedissonMultiLock多数据锁需要借助其他锁实现将其他锁汇总成为一把大锁
是否拿到锁
lockInterruptibly();
收藏
收藏
0 条评论
回复 删除
下一页