Java并发编程:ReentrantLock详解
ReentrantLock 是 Java 并发包(java.util.concurrent.locks)中的一个可重入锁,允许同一个线程多次获取同一把锁。
可重入性
可重入锁允许线程反复进入已获得锁保护的代码段,避免递归调用中的死锁问题。
ReentrantLock与AQS
ReentrantLock 基于 AQS(AbstractQueuedSynchronizer)实现,AQS 维护一个状态字段和一个 FIFO 等待队列来管理线程同步。ReentrantLock 的内部类 Sync 继承自 AQS,并分为 FairSync(公平锁)和 NonfairSync(非公平锁)两个子类。
- 公平锁: 按照线程请求锁的顺序获取锁。
- 非公平锁: 不保证获取锁的顺序,可能存在线程插队。
公平锁与非公平锁实现
- 公平锁: FairSync 在获取锁时会检查队列中是否有其他线程在等待,如果有,即使锁可用,线程也会等待,直到队列为空或成为队列的第一个元素。
- 非公平锁: NonfairSync 获取锁时不会检查队列状态,直接尝试获取,可能导致线程插队,提高吞吐量但牺牲公平性。
ReentrantLock默认实现
ReentrantLock 默认是非公平锁,可通过构造函数传入 true
创建公平锁。
ReentrantLock与synchronized对比
| 特性 | ReentrantLock | synchronized |
| ----------- | ----------- | ----------- |
| 控制粒度 | 显式 | 隐式 |