我想知道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();
}
}
但我知道Lock接口(interface)定义了两个方法,Lock.lock()不能被中断,Lock.lockInterruptically()可以抛出InterruptedException以处理均匀性。
如果锁是使用 wait() 实现的,那么它们不应该通过调用 Thread.interrupt() 来中断吗?
那么锁到底是如何实现的呢?我认为它们是基于其他 Java 低级同步工具(如同步和 wait()/notify()),但我不知道如何实现。
最佳答案
锁是使用其他技术实现的。他们在底层使用了AbstractQueuedSynchronizer。它使用 LockSupport.park()它调用 Unsafe 的 public native void park(boolean var1, long var2)
。
实际上,在 Lock.lock()
中等待的线程仍然可能被中断,但这不会向用户显示,因为不会抛出 InterruptedException
。线程会在中断后醒来,然后清除中断标志并再次尝试获取相同的锁。
Lock.lockInterruptically()
以另一种方式起作用,当中断发生时它会抛出异常,因此用户可以按照他想要的方式处理它。
关于Java Lock.lock() 和 Lock.lockInterruptically(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34894838/