什么是java用于锁定重入?

时间:2011-09-16 23:44:22

标签: java concurrency

  

可能重复:
  What is the Re-entrant lock and concept in general?

我试图理解java中的重入锁,我正在寻找一个简单的解释。为什么需要锁定重入?它解决了什么问题?一个示例场景会有所帮助。

1 个答案:

答案 0 :(得分:3)

可重入锁定是同一个线程可能多次获取的锁定。通常,重入锁必须解锁的次数与锁定的次数相同。重入锁通常更容易编码。如果你有几种方法,其中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并尝试获取锁定的那一刻,您将陷入僵局,因为锁已经拥有,即使它恰好拥有你自己。

例如,初始化为一个计数的纯计数信号量是一个非重入锁定。如果同一个线程试图获取它两次,它将永远阻止一种自我死锁。