redisson的tryLock()和lock()的区别

Reddison是Redis的流行Java客户端,Redis是一种流行的内存数据存储。它为使用Redis提供了许多特性,包括对分布式锁的支持。在Reddison中,tryLock和lock方法用于获取Redis密钥上的锁。

这些方法之间的主要区别是tryLock将尝试在不阻塞的情况下获取锁,而lock将阻塞直到获得锁

使用tryLock获取Redis锁

下面是一个使用tryLock获取Redis锁的例子:

RLock lock = redisson.getLock("myLock");
boolean isLocked = lock.tryLock();
if (isLocked) {
    try {
        // Do some work while holding the lock
    } finally {
        lock.unlock();
    }
} else {
    // Failed to acquire the lock
}

在本例中,调用tryLock方法来尝试获取锁。如果成功获得锁,则在持有锁时执行try块中的代码。如果无法获取锁,则执行else块中的代码。

使用lock获取Redis锁

下面是一个使用lock获取Redis锁的例子:

RLock lock = redisson.getLock("myLock");
lock.lock();
try {
    // Do some work while holding the lock
} finally {
    lock.unlock();
}

在本例中,调用lock方法来获取锁。如果不能立即获得锁,代码将阻塞,直到锁可用为止。获取锁后,将执行try块中的代码,同时持有锁。最后,在Finally块中释放锁。

补充

1

另外,需要注意的是,tryLock()方法可以设置等待时间,如果在等待时间内没有获取到锁,则返回false。例如:

boolean isLocked = lock.tryLock(10, TimeUnit.SECONDS);

上面的代码中,tryLock()方法会等待10秒钟,如果在10秒钟内没有获取到锁,则返回false

2

// waitTime:等待获取锁的最长时间
// leaseTime:租约时间,如果当前线程成功获取到锁,那么锁将被持有的时间长度。这个时间过后,锁会自动释放
boolean hasLock = multiLock.tryLock(1L, 10L, TimeUnit.SECONDS);

注意:如果指定了leaseTime参数,那么看门狗(watchdog)机制不会自动续约

上面的代码中,tryLock()方法会等待1秒钟,如果获取到锁并10秒内任没有完成任务,则锁会自动释放

posted @ 2023-03-28 10:48  进击的小蔡鸟  阅读(4049)  评论(0编辑  收藏  举报