Skip to content

面试速答(先看这里)

**一句话结论:**当我们在使用Redisson实现分布式锁的时候,会经常用到lock和tryLock两个方法,那么他们有啥区别吗?

60秒标准回答:

当我们在使用Redisson实现分布式锁的时候,会经常用到lock和tryLock两个方法,那么他们有啥区别吗?

先来看看代码中是如何解释这两个方法的

这两个方法声明和注释上,主要由以下3个区别

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**先来看看代码中是如何解释这两个方法的:
  • **要点2:**这两个方法声明和注释上,主要由以下3个区别:
  • **要点3:**这其实已经把这个两个方法的区别描述的很清楚了。
  • **要点4:**lock的原理是以阻塞的方式去获取锁,如果获取锁失败会一直等待,直到获取成功。
  • **要点5:**所以,我们可以认为,lock实现的是一个阻塞锁,而tryLock实现的是一个非阻塞锁(在没有指定waitTime的情况下)。

**记忆锚点:**lock → waitTime → tryLock → defined → the → leaseTime

易错提醒:

  • lock的原理是以阻塞的方式去获取锁,如果获取锁失败会一直等待,直到获取成功。

加分表达:

  • 那么,介绍一下就是 tryLock是尝试获取锁,如果能获取到直接返回true,如果无法获取到锁,他会按照我们指定的waitTime进行阻塞,在这个时间段内他还会再尝试获取锁。
  • 如果超过这个时间还没获取到则返回false。
  • 如果我们没有指定waitTime,那么他就在未获取到锁的时候,就直接返回false了。

追问准备:

  • 围绕「lock」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「waitTime」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「tryLock」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

当我们在使用Redisson实现分布式锁的时候,会经常用到lock和tryLock两个方法,那么他们有啥区别吗?

先来看看代码中是如何解释这两个方法的:

plain
/**
 * Tries to acquire the lock with defined <code>leaseTime</code>.
 * Waits up to defined <code>waitTime</code> if necessary until the lock became available.
 *
 * Lock will be released automatically after defined <code>leaseTime</code> interval.
 *
 * @param waitTime the maximum time to acquire the lock
 * @param leaseTime lease time
 * @param unit time unit
 * @return <code>true</code> if lock is successfully acquired,
 *          otherwise <code>false</code> if lock is already set.
 * @throws InterruptedException - if the thread is interrupted
 */
boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException;

/**
 * Acquires the lock with defined <code>leaseTime</code>.
 * Waits if necessary until lock became available.
 *
 * Lock will be released automatically after defined <code>leaseTime</code> interval.
 *
 * @param leaseTime the maximum time to hold the lock after it's acquisition,
 *        if it hasn't already been released by invoking <code>unlock</code>.
 *        If leaseTime is -1, hold the lock until explicitly unlocked.
 * @param unit the time unit
 *
 */
void lock(long leaseTime, TimeUnit unit);

这两个方法声明和注释上,主要由以下3个区别:

  • tryLock

  • Tries to acquire the lock with defined leaseTime

  • Waits up to defined waitTime if necessary until the lock became available.

  • 返回值为boolean

  • lock

  • Acquires the lock with defined leaseTime

  • Waits if necessary until lock became available.

  • 返回值为void

这其实已经把这个两个方法的区别描述的很清楚了。

那么,介绍一下就是tryLock是尝试获取锁,如果能获取到直接返回true,如果无法获取到锁,他会按照我们指定的waitTime进行阻塞,在这个时间段内他还会再尝试获取锁。如果超过这个时间还没获取到则返回false。如果我们没有指定waitTime,那么他就在未获取到锁的时候,就直接返回false了。

plain
RLock lock = redisson.getLock("myLock");
boolean isLocked = lock.tryLock(); // 非阻塞方法,立即返回获取结果
if (isLocked) {
    try {
        // 执行临界区代码
    } finally {
        lock.unlock();
    }
} else {
    // 获取锁失败,处理逻辑
}

lock的原理是以阻塞的方式去获取锁,如果获取锁失败会一直等待,直到获取成功。

plain
RLock lock = redisson.getLock("myLock");
lock.lock(); // 阻塞方法,直到获取到锁
try {
    // 执行代码
} finally {
    lock.unlock();
}

所以,我们可以认为,lock实现的是一个阻塞锁,而tryLock实现的是一个非阻塞锁(在没有指定waitTime的情况下)。