什么是java用于锁定重入?

vid*_*d12 5 java concurrency

可能重复:
一般来说,可重入锁和概念是什么?

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

Edd*_*die 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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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