ReentrantLock 是 JDK @since 1.5 添加的一种颗粒度更小的锁。

可重复进入的锁,但是仅限于当前线程。

lock()

获取锁时:

  • 可获取锁:直接获取锁并返回,设置锁持有者为 1
  • 当前线程持有锁:直接获取锁并返回,同时锁持有者数量递增1
  • 其他线程持有锁:当前线程休眠等待,直至获取锁

常见方法

lockInterruptibly()

获取锁,逻辑和 lock() 方法一样,但这个方法在获取锁过程中能响应中断。

tryLock()

尝试获取锁,这个方法不会等待:

  • 锁空闲:获取锁,返回 true, 设置锁持有者1
  • 当前线程持有锁:获取锁,返回 true, 锁持有者递增1
  • 其他线程持有锁:锁获取失败,返回 true

tryLock(long timeout, TimeUnit unit)

和 tryLock 相似

unlock

释放锁,持有者减 1

newCondition

返回一个这个锁的 Condition 实例,可以实现 synchronized 关键字类似 wait/ notify 实现多线程通信的功能

使用方法

class X {

  private final ReentrantLock lock = new ReentrantLock();

  // ...

  public void m() {
    lock.lock();  // block until condition holds
    try {
      // ... method body
    } finally {
      lock.unlock()
    }
  }

}}