如上图,在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()方法结束,不理解这是为什么
emmm, 我刚刚在这里找到答案了 https://www.programcreek.com/...
之前是我理解错了,当订阅成功时381行就会返回true,监听解锁成功事件的是信号量
LockPubSub.java

tryLock剩余源码
