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()
}
}
}}