java - java中的锁重入是做什么用的?

标签 java concurrency

<分区>

Possible Duplicate:
What is the Re-entrant lock and concept in general?

我想了解 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 的纯计数信号量是不可重入锁。如果同一个线程尝试获取它两次,它将永远阻塞在一种自死锁中。

关于java - java中的锁重入是做什么用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7451424/

相关文章:

java - 我想制作一个 recyclerview,将数据显示到 SQLITE 数据库中的新 Activity

ruby - 如何知道 ruby​​ 中什么不是线程安全的?

session - 在同一个浏览器中拥有两个并发 session 是否有意义?

c++ - 如何消除并行 std::transform_reduce() 的中间容器?

java - 使用 Kotlin 在 Android 中的 UI 组件上声明的最佳方式是什么?

java - 使用相同的 Processor 实例处理不同的注解

java - 如何在端口 8000 上启动 Jenkins?

concurrency - 没有线性化点的方法是否总是无法线性化?

java - 如何取消 FutureResult 执行

java - 扑克游戏中未处理的异常