代码编织梦想

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):使给定的线程停⽌阻塞

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liuruiaaa/article/details/130839165