gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:02:50 29 4
gpt4 key购买 nike

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

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

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

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

问题的澄清:

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

最佳答案

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

可重入锁定的用例:

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

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

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

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

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

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

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com