1

image.png

如上图,在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

请问各位问题出在哪?我理解的有问题吗

再补充一下

image.png

再释放锁执行前,出现了一个线程执行了 l.countDown() 导致await()方法结束,不理解这是为什么

12月3日提问
1 个回答
0

已采纳

emmm, 我刚刚在这里找到答案了 https://www.programcreek.com/...

之前是我理解错了,当订阅成功时381行就会返回true,监听解锁成功事件的是信号量

LockPubSub.java
clipboard.png

tryLock剩余源码
clipboard.png

撰写答案

推广链接