Copy public void lock() {
sync.lock();
}
@ReservedStackAccess
final void lock() {
if (!initialTryLock())
acquire(1);
}
// initialTryLock() 方法
final boolean initialTryLock() {
Thread current = Thread.currentThread();
// 第一次尝试 cas
//如果当前状态值等于预期值,则以原子方式将同步状态设置为给定的更新值。
//此操作具有volatile读写的内存语义
// compareAndSetState(int expect, int update)
// expect - 预期值 update - 新值
if (compareAndSetState(0, 1)) { // first attempt is unguarded
// 这里调用的是AbstractOwnableSynchronizer的方法
// 设置当前拥有独占访问权限的线程。
setExclusiveOwnerThread(current);
return true;
}
// 返回最后由 setExclusiveOwnerThread设置的线程,如果从未设置,则返回 null 。
else if (getExclusiveOwnerThread() == current) {
// getState() 返回同步状态的当前值。 此操作具有volatile读取的内存语义。
int c = getState() + 1;
if (c < 0) // overflow
throw new Error("Maximum lock count exceeded");
// 设置同步状态的值。 此操作具有volatile写入的内存语义。
setState(c);
return true;
} else
return false;
}
// acquire(1);
// 以独占模式获取,忽略中断。 通过至少调用一次tryAcquire(int)实现 ,返回成功。
// 否则线程排队,可能反复阻塞和解除阻塞,调用tryAcquire(int)直到成功。
// 该方法可用于实现方法Lock.lock() 。
public final void acquire(int arg) {
if (!tryAcquire(arg))
acquire(null, arg, false, false, false, 0L);
}
// tryAcquire 需要根据 所看的Sync来决定
// 这里的代码与 initialTryLock 的逻辑类似,不做过多的讲解
protected final boolean tryAcquire(int acquires) {
if (getState() == 0 && compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
return false;
}
// acquire(null, arg, false, false, false, 0L);
final int acquire(Node node, int arg, boolean shared,
boolean interruptible, boolean timed, long time) {
Thread current = Thread.currentThread();
byte spins = 0, postSpins = 0; // retries upon unpark of first thread
boolean interrupted = false, first = false;
Node pred = null; // predecessor of node when enqueued
/*
* Repeatedly:
* Check if node now first
* if so, ensure head stable, else ensure valid predecessor
* if node is first or not yet enqueued, try acquiring
* else if node not yet created, create it
* else if not yet enqueued, try once to enqueue
* else if woken from park, retry (up to postSpins times)
* else if WAITING status not set, set and retry
* else park and clear WAITING status, and check cancellation
*/
for (;;) {
if (!first && (pred = (node == null) ? null : node.prev) != null &&
!(first = (head == pred))) {
if (pred.status < 0) {
//可能从tail重复遍历,取消已取消的节点,直到没有找到为止。
//将可能被重新链接成为下一个合格收购者的节点打开。
cleanQueue(); // predecessor cancelled
continue;
} else if (pred.prev == null) {
Thread.onSpinWait(); // ensure serialization
continue;
}
}
if (first || pred == null) {
boolean acquired;
// 尝试获取共享锁
try {
if (shared)
acquired = (tryAcquireShared(arg) >= 0);
else
acquired = tryAcquire(arg);
} catch (Throwable ex) {
cancelAcquire(node, interrupted, false);
throw ex;
}
if (acquired) {
if (first) {
// 将node 赋值给 head
node.prev = null;
head = node;
pred.next = null;
node.waiter = null;
if (shared)
// 在共享模式下唤醒给定的节点
signalNextIfShared(node);
if (interrupted)
// 调用本线程的interrupt 进行线程中断
current.interrupt();
}
return 1;
}
}
if (node == null) { // allocate; retry before enqueue
if (shared)
node = new SharedNode();
else
node = new ExclusiveNode();
} else if (pred == null) { // try to enqueue
node.waiter = current;
Node t = tail;
node.setPrevRelaxed(t); // avoid unnecessary fence
if (t == null)
tryInitializeHead();
else if (!casTail(t, node))
node.setPrevRelaxed(null); // back out
else
t.next = node;
} else if (first && spins != 0) {
--spins; // reduce unfairness on rewaits
Thread.onSpinWait();
} else if (node.status == 0) {
node.status = WAITING; // enable signal and recheck
} else {
long nanos;
spins = postSpins = (byte)((postSpins << 1) | 1);
if (!timed)
LockSupport.park(this);
else if ((nanos = time - System.nanoTime()) > 0L)
LockSupport.parkNanos(this, nanos);
else
break;
node.clearStatus();
if ((interrupted |= Thread.interrupted()) && interruptible)
break;
}
}
return cancelAcquire(node, interrupted, interruptible);
}