问一个Redisson 源码中的问题
如上图,在RedissonLock.tryLock() 方法中
个人理解
381行,当前线程无法获取到锁时,订阅解锁事件,调用await等待获取锁的线程释放锁(或者超出等待时间)
我遇到的问题
public static void main(String[] args) throws InterruptedException {
Config config = new Config();
config.useSingleServer()
.setAddress("redis://127.0.0.1:6379");
RedissonClient redissonClient =Redisson.create(config);
RLock lock = redissonClient.getLock("test");
lock.tryLock(10, 10, TimeUnit.SECONDS);
new Thread(() -> {
try {
lock.tryLock(10, 10, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
lock.unlock();
}).start();
try {
System.out.println("执行主线程逻辑");
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
lock.unlock();
System.out.println("主线程解锁");
}
debug上述代码时,主线程还没有解锁时,我发现线程2(就是我的new的Thread)已经到了我394行的断点...并没有像我想的那样等待释放锁,超时的问题也不存在...
redisson 版本3.10.7
请问各位问题出在哪?我理解的有问题吗
再补充一下
再释放锁执行前,出现了一个线程执行了 l.countDown()
导致await()方法结束,不理解这是为什么
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
emmm, 我刚刚在这里找到答案了 https://www.programcreek.com/...
之前是我理解错了,当订阅成功时381行就会返回true,监听解锁成功事件的是信号量
LockPubSub.java
tryLock剩余源码