gpt4 book ai didi

Java Lock.lock() 和 Lock.lockInterruptibly()

转载 作者:行者123 更新时间:2023-11-30 08:05:41 28 4
gpt4 key购买 nike

我想知道锁是如何在 Java 中实现的。在一些教程中,我发现它们应该使用 wait() 和 notify()/notifyAll() 以及一些 boolean 标志来实现(它可能比那复杂得多,但基本上应该是那样)

class SimpleLock {

private boolean locked=false;

public synchronized void lock() throws InterruptedException {
while (locked)
wait();
locked=true;
}

public synchronized void unlock() throws InterruptedException {
locked=false;
notify();
}

}

但我知道接口(interface) Lock 定义了两个方法,不能被中断的 Lock.lock() 和 Lock.lockInterruptibly() 可以并抛出 InterruptedException 以处理 evenience。

如果锁是使用 wait() 实现的,它们不应该被调用 Thread.interrupt() 中断吗?

那么锁是如何真正实现的呢?我认为它们基于其他 Java 低级同步工具(如 synchronized 和 wait()/notify()),但我不知道如何实现。

最佳答案

锁是使用其他技术实现的。他们在后台使用 AbstractQueuedSynchronizer。它使用 LockSupport.park()它调用 Unsafe 的 public native void park(boolean var1, long var2)

实际上,在 Lock.lock() 中等待的线程仍然可以被中断,但这不会向用户显示,因为不会抛出 InterruptedException。线程会在中断后被唤醒,然后清除中断标志并再次尝试获取相同的锁。

Lock.lockInterruptibly() 的作用是另一种方式,当中断发生时它会抛出异常,因此用户可以按照自己的意愿进行处理。

关于Java Lock.lock() 和 Lock.lockInterruptibly(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34894838/

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