Java中ReentrantLock源码深度解析
目录
引言
ReentrantLock
是Java并发包中的一个可重入锁实现类,它提供了比synchronized
更灵活的锁机制。ReentrantLock
支持公平锁和非公平锁,并且提供了可中断的锁获取操作、超时锁获取操作以及条件变量等功能。本文将从源码的角度深入分析ReentrantLock
的实现原理。
ReentrantLock的数据结构
ReentrantLock
的核心数据结构是一个内部类Sync
,它继承自AbstractQueuedSynchronizer
(AQS)。Sync
通过AQS的state
字段表示锁的状态,并通过exclusiveOwnerThread
字段表示当前持有锁的线程。
abstract static class Sync extends AbstractQueuedSynchronizer {
private static final long serialVersionUID = -5179523762034025860L;
abstract void lock(); // 加锁方法
final boolean nonfairTryAcquire(int acquires) {
// 非公平锁的获取方法
final Thread current = Thread.currentThread();
int c = getState();
if (c == 0) {
if (compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;