Java 重入锁。 unlock方法没有重置header,如何移除包裹在节点中的已执行线程?
Java ReentrantLock. Unlock method does not reset the header, how to remove the executed thread wrapped in a node?
最近在学习JavaReentrantLock源码。
在解锁方法上,它实际上做了两件事:
(1) 检查是否获取号==释放号,如果是,设置ExclusiveOwnerThread为null;
(2) 如果 (1) OK,unpark successor;
public final boolean release(int arg) {
if (tryRelease(arg)) {
Node h = head;
if (h != null && h.waitStatus != 0)
unparkSuccessor(h);
return true;
}
return false;
}
我的问题是,所有这些操作都没有改变 header 或 dequeue 等待中的任何节点 queue。
如果不重置 header 或 dequeue 操作,等待的 queue 将随着新线程获取锁而无限增长。
任何人都可以指出我在哪里忽略或我的理解有问题吗?
acquireQueued
方法中队列操作的头
final boolean acquireQueued(final Node node, int arg) {
boolean failed = true;
try {
boolean interrupted = false;
for (;;) {
final Node p = node.predecessor();
if (p == head && tryAcquire(arg)) {
//reset header, the second node of queue will be new header
setHead(node);
//help GC, the old header node will be GC
p.next = null;
failed = false;
return interrupted;
}
if (shouldParkAfterFailedAcquire(p, node) &&
parkAndCheckInterrupt())
interrupted = true;
}
} finally {
if (failed)
cancelAcquire(node);
}
}
最近在学习JavaReentrantLock源码。 在解锁方法上,它实际上做了两件事: (1) 检查是否获取号==释放号,如果是,设置ExclusiveOwnerThread为null; (2) 如果 (1) OK,unpark successor;
public final boolean release(int arg) {
if (tryRelease(arg)) {
Node h = head;
if (h != null && h.waitStatus != 0)
unparkSuccessor(h);
return true;
}
return false;
}
我的问题是,所有这些操作都没有改变 header 或 dequeue 等待中的任何节点 queue。
如果不重置 header 或 dequeue 操作,等待的 queue 将随着新线程获取锁而无限增长。
任何人都可以指出我在哪里忽略或我的理解有问题吗?
acquireQueued
方法中队列操作的头
final boolean acquireQueued(final Node node, int arg) {
boolean failed = true;
try {
boolean interrupted = false;
for (;;) {
final Node p = node.predecessor();
if (p == head && tryAcquire(arg)) {
//reset header, the second node of queue will be new header
setHead(node);
//help GC, the old header node will be GC
p.next = null;
failed = false;
return interrupted;
}
if (shouldParkAfterFailedAcquire(p, node) &&
parkAndCheckInterrupt())
interrupted = true;
}
} finally {
if (failed)
cancelAcquire(node);
}
}