java中的锁重入用于什么?

java中的锁重入用于什么?,java,concurrency,Java,Concurrency,可能重复: 我正在试图理解java中的可重入锁,我正在寻找一个简单的解释。为什么需要锁重入?它解决了什么问题?一个示例场景会有所帮助。可重入锁是指同一线程可以多次获取的锁。通常,重入锁的解锁次数必须与锁定次数相同。重入锁通常更容易编码。如果你有几个方法,其中A调用B,B调用C。。。但是这段代码的客户机可以调用A、B或C,如果您想在这些方法中的每一个方法中进行锁定,那么可重入锁将解决您的问题。它将一次阻止除一个线程之外的任何线程访问此代码,但它将允许多个锁获取,这样您就不会自己死锁 假设你有:

可能重复:


我正在试图理解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();
    }
  }
}
其中,其他代码可以调用
doA
doB
doC
中的任何一个,并且它们都使用相同的锁围绕某些工作进行同步。使用的锁是“可重入的”,因为同一线程可以多次获取它。如果锁不可重入,那么当您调用
doA
时,当您输入
doB
并尝试获取锁时,您将死锁,因为锁已经拥有,即使它碰巧是您自己拥有的


例如,初始化为1计数的纯计数信号量是不可重入的锁。如果同一个线程尝试获取它两次,它将永远处于一种自死锁状态。

不是完全重复。这个问题更加具体,并且与一些特定的Java锁实现有关。另一个问题非常笼统。