这个问题已经在这里有了答案:




9年前关闭。






我试图了解Java中的可重入锁,并且正在寻找一个简单的解释。为什么必须重新输入锁?它解决什么问题?一个示例场景会有所帮助。

最佳答案

可重入锁是,同一线程可能获得不止一次的锁。通常,可重入锁必须与被锁定相同的次数被解锁。可重入锁通常更容易编码。如果您有几种方法,其中A调用B且B调用C ...,但是此代码的客户端可以调用A或B或C,并且您想在每个方法中进行锁定,则可重入锁定将解决您的问题。问题。它将阻止一次除一个线程以外的任何线程访问此代码,但是它将允许多次锁定获取,因此您不会死锁自己。

假设您有以下内容:

public class SyncTest {
  private final Lock lock = new ReentrantLock();
  public void doA() {
    lock.lock();
    try {
      doB();
      doSomethingForA();
    } finally {
      lock.unlock();
    }
  }

  public void doB() {
    lock.lock();
    try {
      doC();
      doSomethingForB();
    } finally {
      lock.unlock();
    }
  }

  public void doC() {
    lock.lock();
    try {
      doSomeWorkThatEveryoneDoes();
    } finally {
      lock.unlock();
    }
  }
}

其他代码可以调用doAdoBdoC中的任何一个,并且所有这些代码都使用相同的锁在某些工作周围进行同步。使用的锁是“可重入”的,因为同一线程可以多次获取该锁。如果该锁不是可重入的,则当您调用doA时,在您输入doB并尝试获取该锁的那一刻,您将死锁,因为该锁已被拥有,即使它恰好是您自己拥有的。

例如,初始化为1的计数的纯计数信号量是不可重入锁。如果同一线程尝试两次获取它,它将以某种自死锁的方式永远阻塞。

09-25 20:15