ReentrantLock原理剖析
ReentrantLock 是 Java 并发包 (java.util.concurrent.locks) 中的一个可重入锁实现,提供了比 synchronized 更灵活的锁机制。下面是对 ReentrantLock 的源码分析和原理剖析
核心概念
- 可重入性:同一个线程可以多次获取同一把锁,而不会导致死锁。
- 公平性:
ReentrantLock支持公平锁和非公平锁。公平锁会按照线程请求锁的顺序来分配锁,而非公平锁则允许插队。 - 条件变量:
ReentrantLock提供了Condition对象,用于线程间的等待/通知机制。
AQS 的核心机制
AQS 使用一个 volatile 的 int 类型的 state 变量来表示锁的状态,并通过 CAS (Compare-And-Swap) 操作来保证线程安全。
- state:表示锁的状态。对于
ReentrantLock,state为 0 表示锁未被持有,大于 0 表示锁被持有,并且可以重入。 - CLH 队列:AQS 使用一个双向链表(CLH 队列)来管理等待锁的线程。
公平锁与非公平锁的区别
- 非公平锁:在锁释放时,新来的线程可以直接尝试获取锁,而不需要排队。这可能会导致线程饥饿,但提高了吞吐量。
- 公平锁:在锁释放时,只有等待队列中的第一个线程可以获取锁,保证了公平性,但可能会降低吞吐量。
条件变量 (Condition)
ReentrantLock 提供了 newCondition 方法,用于创建 Condition 对象。Condition 提供了类似于 Object.wait() 和 Object.notify() 的机制,但更加灵活。
总结
ReentrantLock是一个基于 AQS 的可重入锁实现,提供了比synchronized更灵活的锁机制。- 它支持公平锁和非公平锁,允许线程重入,并且提供了条件变量机制。
- AQS 是
ReentrantLock的核心,通过state和 CLH 队列来管理锁的状态和线程的等待。