我想知道锁是如何在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.lockInterruptibly(),前者不能被中断,后者可以和InterruptedException一起抛出以处理平衡。
如果锁是使用wait()实现的,难道不应该通过调用Thread.interrupt()来中断它们吗?
那么锁到底是如何实现的呢?我认为它们是基于其他Java低级同步工具(如synchronized和wait()/notify())的,但我不知道是如何实现的。
发布于 2016-01-20 16:51:41
锁是使用其他技术实现的。他们在幕后使用AbstractQueuedSynchronizer。它使用调用不安全的public native void park(boolean var1, long var2)的LockSupport.park()。
实际上,在Lock.lock()中等待的线程仍然可以被中断,但这不会显示给用户,因为InterruptedException不会被抛出。线程将在中断后唤醒,然后清除中断标志,并再次尝试获取相同的锁。
Lock.lockInterruptibly()以另一种方式工作,当中断发生时,它会抛出一个异常,所以用户可以按照他想要的方式处理它。
https://stackoverflow.com/questions/34894838
复制相似问题