ReentrantLock原理剖析

145 阅读2分钟

ReentrantLock原理剖析

ReentrantLock 是 Java 并发包 (java.util.concurrent.locks) 中的一个可重入锁实现,提供了比 synchronized 更灵活的锁机制。下面是对 ReentrantLock 的源码分析和原理剖析

核心概念

  • 可重入性:同一个线程可以多次获取同一把锁,而不会导致死锁。
  • 公平性ReentrantLock 支持公平锁和非公平锁。公平锁会按照线程请求锁的顺序来分配锁,而非公平锁则允许插队。
  • 条件变量ReentrantLock 提供了 Condition 对象,用于线程间的等待/通知机制。

AQS 的核心机制

AQS 使用一个 volatile 的 int 类型的 state 变量来表示锁的状态,并通过 CAS (Compare-And-Swap) 操作来保证线程安全。

  • state:表示锁的状态。对于 ReentrantLockstate 为 0 表示锁未被持有,大于 0 表示锁被持有,并且可以重入。
  • CLH 队列:AQS 使用一个双向链表(CLH 队列)来管理等待锁的线程。

公平锁与非公平锁的区别

  • 非公平锁:在锁释放时,新来的线程可以直接尝试获取锁,而不需要排队。这可能会导致线程饥饿,但提高了吞吐量。
  • 公平锁:在锁释放时,只有等待队列中的第一个线程可以获取锁,保证了公平性,但可能会降低吞吐量。

条件变量 (Condition)

ReentrantLock 提供了 newCondition 方法,用于创建 Condition 对象。Condition 提供了类似于 Object.wait() 和 Object.notify() 的机制,但更加灵活。

总结

  • ReentrantLock 是一个基于 AQS 的可重入锁实现,提供了比 synchronized 更灵活的锁机制。
  • 它支持公平锁和非公平锁,允许线程重入,并且提供了条件变量机制。
  • AQS 是 ReentrantLock 的核心,通过 state 和 CLH 队列来管理锁的状态和线程的等待。