locksupport实际上是调⽤了unsafe类⾥的函数,归结到unsafe⾥,只有两个函数-爱代码爱编程
final boolean acquireQueued(final Node node, int arg) {
boolean failed = true;
try {
boolean interrupted = false;
// ⾃旋
for (;;) {
final Node p = node.predecessor();
// 如果node的前驱结点p是head,表示node是第⼆个结点,就可以尝试去获取资源了
if (p == head && tryAcquire(arg)) {
// 拿到资源后,将head指向该结点。
// 所以head所指的结点,就是当前获取到资源的那个结点或null。
setHead(node);
p.next = null; // help GC
failed = false;
return interrupted;
}
// 如果⾃⼰可以休息了,就进⼊waiting状态,直到被unpark()
if (shouldParkAfterFailedAcquire(p, node) &&
parkAndCheckInterrupt())//<<<<==================================
interrupted = true;
}
} finally {
if (failed)
cancelAcquire(node);
}
}
这⾥parkAndCheckInterrupt⽅法内部使⽤到了LockSupport.park(this),顺便简单介绍⼀下park。
LockSupport类是Java 6 引⼊的⼀个类,提供了基本的线程同步原语。
LockSupport实际上是调⽤了Unsafe类⾥的函数,归结到Unsafe⾥,只有两个函数:
park(boolean isAbsolute, long time):阻塞当前线程
unpark(Thread jthread):使给定的线程停⽌阻塞