//从下面这个判断可以判断出,这个抢锁过程是公平的
//如果上一个线程是头结点
//并且自己尝试获取锁成功
if (p == head && tryAcquire(arg)) {
//那么该线程就可以继续运行了
//先将头结点设为自己
setHead(node);
//断开与头结点的连接
//让头结点可以回收
p.next = null; // help GC
//failed为false代表自旋过程无出错
failed = false;
//自旋结束,返回true,回到上一层继续运行
return true;
}
//上一个不是头结点,或者虽然是头结点但抢不到锁
//计算还需要等待多长时间
nanosTimeout = deadline - System.nanoTime();
//如果没有时间剩余了
if (nanosTimeout <= 0L)
//返回false
//上一层处理
return false;
//还有时间剩余,看需不需要park
//这里一样是自旋两次,然后就会返回true,代表需要Park
//继续判断剩余时间是否足够进行park
//因为如果park需要的时间都要多于线程剩下的时间
//没什么必要park了,让其再自旋多一次,拿不到就超时返回false
if (shou Java开源项目【ali1024.coding.net/public/P7/Java/git】 ldParkAfterFailedAcquire(p, node) &&<