Lock (接口)
└── ReentrantLock (可重入独占锁)
└── Sync extends AbstractQueuedSynchronizer (AQS)
├── NonfairSync (非公平,默认)
└── FairSync (公平)
ReadWriteLock (接口)
└── ReentrantReadWriteLock (可重入读写锁)
├── ReadLock (共享锁)
├── WriteLock (独占锁)
└── Sync extends AQS
├── NonfairSync
└── FairSync
lock() → 先 CAS 抢占 compareAndSetState(0,1) 成功即得,失败走 acquire(1) 入队。lock() → 直接 acquire(1),tryAcquire 中检查 !hasQueuedPredecessors() 确保队头优先。// 非公平尝试获取(非公平锁 lock()、tryLock() 直接调用)
final boolean nonfairTryAcquire(int acquires) {
Thread current = Thread.currentThread();
int c = getState();
if (c == 0) { // 无锁
if (compareAndSetState(0, acquires)) { // CAS 抢占
setExclusiveOwnerThread(current);
return true;
}
} else if (current == getExclusiveOwnerThread()) { // 重入
int nextc = c + acquires;
if (nextc < 0) throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}
// 释放
protected final boolean tryRelease(int releases) {
int c = getState() - releases;
if (Thread.currentThread() != getExclusiveOwnerThread())
throw new IllegalMonitorStateException();
boolean free = false;
if (c == 0) { // 完全释放
free = true;
setExclusiveOwnerThread(null);
}
setState(c);
return free; // 返回 true 则 unparkSuccessor 唤醒后继
}
// 公平锁尝试获取
protected final boolean tryAcquire(int acquires) {
Thread current = Thread.currentThread();
int c = getState();
if (c == 0) {
// 关键差异:检查队列前驱
if (!hasQueuedPredecessors() && compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
} else if (current == getExclusiveOwnerThread()) {
// 重入逻辑同非公平
}
return false;
}
getHoldCount():当前线程重入次数。isHeldByCurrentThread():是否持有锁。isLocked():锁是否被占用。getQueueLength()、hasQueuedThreads()、getQueuedThreads():队列状态。newCondition():创建 ConditionObject。一个 int state 存双值:
sharedCount(读锁持有数)。exclusiveCount(写锁重入数)。static final int SHARED_SHIFT = 16;
static final int SHARED_UNIT = 1 << SHARED_SHIFT; // 0x00010000
static final int MAX_COUNT = (1 << SHARED_SHIFT) - 1; // 0xFFFF
static final int EXCLUSIVE_MASK = (1 << SHARED_SHIFT) - 1;
static int sharedCount(int c) { return c >>> SHARED_SHIFT; }
static int exclusiveCount(int c) { return c & EXCLUSIVE_MASK; }
protected final boolean tryAcquire(int acquires) {
Thread current = Thread.currentThread();
int c = getState();
int w = exclusiveCount(c);
if (c != 0) { // 有锁存在
if (w == 0 || current != getExclusiveOwnerThread()) return false; // 有读锁或别的写锁
if (w + exclusiveCount(acquires) > MAX_COUNT) throw new Error("Maximum lock count exceeded");
setState(c + acquires); // 重入
return true;
}
// 无锁:公平性检查 + CAS
if (writerShouldBlock() || !compareAndSetState(c, c + acquires)) return false;
setExclusiveOwnerThread(current);
return true;
}
protected final int tryAcquireShared(int unused) {
Thread current = Thread.currentThread();
int c = getState();
// 有写锁且非当前线程 -> 失败
if (exclusiveCount(c) != 0 && getExclusiveOwnerThread() != current) return -1;
int r = sharedCount(c);
// 公平性检查 + 未达上限 + CAS
if (!readerShouldBlock() && r < MAX_COUNT && compareAndSetState(c, c + SHARED_UNIT)) {
// 记录当前线程读锁计数(ThreadLocal + 首读者优化)
if (r == 0) { firstReader = current; firstReaderHoldCount = 1; }
else if (firstReader == current) { firstReaderHoldCount++; }
else { /* ThreadLocalHoldCounter 计数 */ }
return 1; // 成功
}
return fullTryAcquireShared(current); // 复杂情况循环尝试
}
// 非公平:writerShouldBlock=false, readerShouldBlock=false (或检查队头是否写锁)
static final class NonfairSync extends Sync {
final boolean writerShouldBlock() { return false; }
final boolean readerShouldBlock() { return false; /* 或 apparentlyFirstQueuedIsExclusive() */ }
}
// 公平:writerShouldBlock/readerShouldBlock 均为 hasQueuedPredecessors()
static final class FairSync extends Sync {
final boolean writerShouldBlock() { return hasQueuedPredecessors(); }
final boolean readerShouldBlock() { return hasQueuedPredecessors(); }
}
使用 ThreadLocalHoldCounter 维护每线程读锁计数,释放时递减,CAS 递减 state 高 16 位。
writerShouldBlock/readerShouldBlock 策略方法控制插队行为。exclusiveOwnerThread,共享锁靠 ThreadLocalHoldCounter。synchronized,需可中断、超时、公平、多 Condition 场景。