基本特点

ReentrantLock 和 synchronized 相比具备如下的特点:

  • 可以中断
  • 可以设置超时时间
    • 通过调用 tryLock()【有带有超时时间和不带超时时间的,不带表示立即】方法尝试获取锁,如果是带有超时时间的,在设定的时间之内还没有获取锁,依然可以返回,不会阻塞。
  • 可以设置为公平锁,默认情况下是非公平锁。创建对象的时候使用 ReentrantLock lock=new ReetrantLock(true) 的形式就可以创建公平锁。
  • 支持多个条件变量
  • 和 synchronized 一样,也是可重入锁

    基本语法

    1. // 获取锁
    2. reentrantLock.lock();
    3. try {
    4. // 临界区
    5. } finally {
    6. // 释放锁
    7. reentrantLock.unlock();
    8. }

    ReentrantLock 的条件变量

  • synchronized 中也是有条件变量的,就是 Monitor 对象中的 waitSet, 当条件不满足的时候可以进入 waitSet 等待

  • ReetrantLock 中的条件变量比 synchronized 中更强大的地方在于可以支持多个条件变量,这样在唤醒的时候就可以根据条件来进行唤醒,而不是唤醒所有线程。

    使用要点

  • await 前需要获得锁

  • await 执行后,会释放锁,进入 conditionObject 等待
  • await 的线程被唤醒(或打断,或超时)会重新竞争 lock 锁
  • 竞争 lock 锁成功之后,从 await 后继续执行

ReentrantLock 原理

继承体系
image.png