java - 为什么要递归地获取(可重入)锁?

标签 java multithreading recursion reentrantlock

ReentrantLock 允许线程递归地获取相同的锁,因此锁计数在连续的锁定/解锁时递增和递减。而在释放给其他线程之前,锁计数必须递减为零。

为什么或在什么情况下我会编写递归获取锁的代码?

我认为拥有该功能的唯一一点是方便我们编写递归代码,其中递归调用方法(在其执行过程中获取锁)。

在任何其他情况下,线程递归/重复获取锁是否有用?

问题的澄清:

  • 请忽略正在重入的锁。恰好递归性是由可重入锁提供的。
  • 我指的是锁的递归特性
  • 请不要回答为什么使用可重入锁。
  • 请不要回答“递归不是可重入锁的主要特征”
  • 我想知道什么情况下需要递归获取锁,无论锁是否可重入。

最佳答案

还不如搜索更好: this should be helpful

可重入锁定的用例:

可重入锁的一个(有点通用和做作的)应用示例可能是:

  1. 你有一些涉及遍历 a 的算法的计算 图(可能有循环)。一次遍历可能访问同一个 由于循环或由于多条路径到 同一个节点。

  2. 数据结构受并发访问的影响,可以是 出于某种原因更新,也许是由另一个线程。你需要成为 能够锁定单个节点以处理潜在的数据损坏 由于竞争条件。由于某种原因(也许是性能)你 不想全局锁定整个数据结构。

  3. 您的计算无法保留关于哪些节点的完整信息 您访问过,或者您使用的数据结构不允许 快速回答“我以前来过这里吗”的问题。

  4. 这种情况的一个例子是一个简单的实现 Dijkstra 算法,优先级队列实现为二进制 堆或使用简单链表作为队列的广度优先搜索。 在这些情况下,扫描现有插入队列的时间复杂度为 O(N) 而且您可能不想在每次迭代时都这样做。

在这种情况下,跟踪您已经拥有的锁 收购是昂贵的。假设您想在节点上进行锁定 级别重入锁定机制减轻了告诉的需要 你之前是否访问过一个节点。你可以盲目地锁定 节点,也许在您将其从队列中弹出后将其解锁。

关于java - 为什么要递归地获取(可重入)锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26542741/

相关文章:

list - 搜索元组列表 f#

algorithm - 关于递归算法的思考

java - 无法从服务器接收数据

java - 无论如何要排除从父 POM 继承的 Artifact ?

java - 如何杀死等待中的线程?

c# - 在 TPL 中安全添加集合

java - 数组中的给定元素找到等于目标值的组合

java - 如何从不同的表单更新 jtable?

java - 使用字符串调用对象 - Java

Java线程捕获所有异常?