基本特点
ReentrantLock 和 synchronized 相比具备如下的特点:
- 可以中断
- 可以设置超时时间
- 通过调用 tryLock()【有带有超时时间和不带超时时间的,不带表示立即】方法尝试获取锁,如果是带有超时时间的,在设定的时间之内还没有获取锁,依然可以返回,不会阻塞。
- 可以设置为公平锁,默认情况下是非公平锁。创建对象的时候使用 ReentrantLock lock=new ReetrantLock(true) 的形式就可以创建公平锁。
- 支持多个条件变量
-
基本语法
// 获取锁
reentrantLock.lock();
try {
// 临界区
} finally {
// 释放锁
reentrantLock.unlock();
}
ReentrantLock 的条件变量
synchronized 中也是有条件变量的,就是 Monitor 对象中的 waitSet, 当条件不满足的时候可以进入 waitSet 等待
ReetrantLock 中的条件变量比 synchronized 中更强大的地方在于可以支持多个条件变量,这样在唤醒的时候就可以根据条件来进行唤醒,而不是唤醒所有线程。
使用要点
await 前需要获得锁
- await 执行后,会释放锁,进入 conditionObject 等待
- await 的线程被唤醒(或打断,或超时)会重新竞争 lock 锁
- 竞争 lock 锁成功之后,从 await 后继续执行
ReentrantLock 原理
继承体系