gpt4 book ai didi

java - 重入锁实现细节

转载 作者:行者123 更新时间:2023-12-03 12:58:13 25 4
gpt4 key购买 nike

我试图了解ReentrantLock::lock方法中的特定细节。我正在查看它,并看到它是:

final void lock() {
if (!initialTryLock()) {
acquire(1);
}
}
因此,首先尝试使用以下方法: initialTryLock(我将在 NonfairSync中查看),该方法将执行以下操作:
  • 它执行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,对吗?
    我认为这是一种潜在的重试方法,因为在 initialTryLocktryAcquire的调用之间,该锁可能已被释放。这样做的好处可能是因为下一个操作(在 tryAcquire之后)失败了,因此该线程的排队费用很高。因此,我想这样(重试)是有道理的吗?

    最佳答案

    只是添加到the answer above

    tryAcquire could have simply returned false, right?


    不。
    此实现:
    boolean tryAcquire(int acquires) {
    return false;
    }
    会破坏 AbstractQueuedSynchronizer的工作。
    原因是 tryAcquire()是获取 AbstractQueuedSynchronizer的唯一方法。
    甚至 acquire() in the end uses tryAcquire()
    因此,如果 tryAcquire()始终返回 false,则 acquire()将永远不会获得锁定。
    当多个线程争用该锁时,将使用 acquire()

    关于java - 重入锁实现细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65928109/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com