首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Lock.lock()和Lock.lockInterruptibly()

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

Stack Overflow用户
提问于 2016-01-20 16:21:12
回答 1查看 619关注 0票数 2

我想知道锁是如何在Java中实现的。在一些教程中,我发现应该使用wait()和notify()、/notifyAll()和一些布尔标志来实现它们(可能比这复杂得多,但基本上应该是这样的)

代码语言:javascript
复制
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())的,但我不知道是如何实现的。

EN

回答 1

Stack Overflow用户

发布于 2016-01-20 16:51:41

锁是使用其他技术实现的。他们在幕后使用AbstractQueuedSynchronizer。它使用调用不安全的public native void park(boolean var1, long var2)LockSupport.park()

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

Lock.lockInterruptibly()以另一种方式工作,当中断发生时,它会抛出一个异常,所以用户可以按照他想要的方式处理它。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34894838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档