Java Lock.lock() 和 Lock.lockInterruptically()

标签 java multithreading locking interrupted-exception

我想知道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/

相关文章:

java - 从Java服务器发送图像到android客户端

php - MySQL 锁 : order of unblocked threads

java - 从 Scala 代码下载涉及 Http 身份验证的文件

java - 我没有实现 `Collections.rotate` 对吧?

java - 在简单的聊天程序中,服务器发送字符串的数组列表,但客户端接收旧值

java - ThreadpoolExecutor 和主线程并行执行

c# - Monitor.Enter(object,ref bool)锁获取的实现和顺序

Java 将显式锁与同步方法结合起来

java - 如何使用 REST JAX-RS 实现在满足特定条件时重定向用户?

java - 如何在Hibernate中拦截I/O db操作?