我试图了解ReentrantLock::lock
方法中的特定细节。我正在查看它并将其视为:
final void lock() {
if (!initialTryLock()) {
acquire(1);
}
}
所以首先它尝试这个方法:(initialTryLock
我会看看NonfairSync
),它这样做:
- 它做了 a
compareAndSwap(0, 1)
,这意味着如果没有人持有锁(0
)并且我可以抓住它(1
),我现在持有锁。 - 如果上述失败,它会检查请求锁的线程是否已经是所有者。
- 如果失败,它会返回
false
,这意味着我无法获得锁。
让我们假设上述失败。然后它继续并acquire
调用AbstractQueuedSynchronizer
:
public final void acquire(int arg) {
if (!tryAcquire(arg))
acquire(null, arg, false, false, false, 0L);
}
tryAcquire
它首先调用NonfairSync
:
protected final boolean tryAcquire(int acquires) {
if (getState() == 0 && compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
return false;
}
您可以看到它再次尝试获取锁,尽管initialTryLock
已经失败。从理论上讲,这本tryAcquire
可以简单地返回false
,对吗?
我认为这是一次潜在的重试,因为在调用initialTryLock
and之间tryAcquire
,锁可能已被释放。这样做的好处可能是因为下一个操作(之后tryAcquire
)失败,是该线程的昂贵入队。所以我想这是有道理的(重试)因为那个?