深入解析 ReentrantLock:原理、公平锁与非公平锁的较量
ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个重要类,用于实现线程同步,支持可重入性,并且可以选择公平锁或非公平锁的实现方式。下面将详细介绍 ReentrantLock 的实现原理以及公平锁和非公平锁的区别。
ReentrantLock 实现原理
基本架构
ReentrantLock 主要依赖于 AbstractQueuedSynchronizer(简称 AQS)来实现锁的同步机制。AQS 是一个用于构建锁和同步器的框架,它使用一个 int 类型的状态变量 state 来表示锁的状态,同时维护一个 FIFO(先进先出)的双向队列,用于存储等待获取锁的线程。
可重入性的实现
可重入性是指同一个线程可以多次获取同一把锁而不会被阻塞。ReentrantLock 通过 AQS 的 state 变量来记录线程获取锁的次数。
- 当一个线程第一次获取锁时,state 会从 0 变为 1,同时记录当前持有锁的线程。
- 如果该线程再次获取同一把锁,state 的值会相应地增加(例如变为 2、3 等),表示重入次数。
- 每次释放锁时,state 的值会减 1,直到 state 变为 0 时,锁才真正被释放,其他线程才可以竞争该锁。
以下是 ReentrantLock 可重入性的简单示例代码:
import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockExample {private final ReentrantLock lock = new ReentrantLock();public void method1() {lock.lock();try {System.out.println("Method 1: Lock acquired");method2();} finally {lock.unlock();}}public void method2() {lock.lock();try {System.out.println("Method 2: Lock acquired");} finally {