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

时间:2016-01-20 08:21:12

标签: java multithreading locking interrupted-exception

我想知道如何在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()),但我不知道如何。

1 个答案:

答案 0 :(得分:3)

使用其他技术实现锁定。他们在引擎盖下使用AbstractQueuedSynchronizer。它使用LockSupport.park()来调用不安全的public native void park(boolean var1, long var2)

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

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