我想知道如何在Java中实现锁。 在一些教程中我发现它们应该使用wait()和notify()/ notifyAll()以及一些布尔标志来实现(它可能要复杂得多,但基本上应该是这样)
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定义了两个方法,Lock.lock()不能被中断,Lock.lockInterruptibly()可以并且抛出InterruptedException来处理偶数。
如果使用wait()实现了锁,那么它们不应该被调用Thread.interrupt()来中断吗?
那么锁是如何实现的呢?我认为它们基于其他Java低级同步工具(如synchronized和wait()/ notify()),但我不知道如何。
答案 0 :(得分:3)
使用其他技术实现锁定。他们在引擎盖下使用AbstractQueuedSynchronizer
。它使用LockSupport.park()来调用不安全的public native void park(boolean var1, long var2)
。
实际上在Lock.lock()
中等待的线程仍然可能被中断,但是这不会向用户显示,因为InterruptedException
不会被抛出。线程将在中断后唤醒,然后清除中断标志并尝试再次获取相同的锁。
Lock.lockInterruptibly()
采取另一种方式,当发生中断时会抛出异常,因此用户可以按照自己的方式处理。