首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么递归地获取(重入)锁?

为什么递归地获取(重入)锁?
EN

Stack Overflow用户
提问于 2014-10-24 06:41:13
回答 1查看 1.1K关注 0票数 3

ReentrantLock允许线程递归地获取相同的锁,以便在连续的锁/解锁时增加和减少锁计数。然而,在将锁计数释放到其他线程之前,必须将锁计数减为零。

为什么或者在什么情况下,我要编写代码来递归地获取锁?

我能看到的唯一一点就是让我们更方便地编写递归代码,其中一个方法(在它的执行过程中获得一个锁)被递归地调用。

在其他情况下,通过线程递归/重复获取锁会有用吗?

对问题的澄清:

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

回答 1

Stack Overflow用户

发布于 2014-10-24 06:54:28

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

重入锁定用例:

可重入锁的应用程序示例(有些是通用的和人为的)可能是:

  1. 您有一些涉及遍历图(可能包含循环)的算法的计算。由于周期或同一节点的多条路径,遍历可以多次访问同一节点。
  2. 数据结构受并发访问的限制,可能由于某些原因而更新,可能是由另一个线程更新的。您需要能够锁定单个节点,以处理由于竞争条件导致的潜在数据损坏。由于某些原因(可能是性能),您不希望全局锁定整个数据结构。
  3. 您的计算无法保留您访问过的节点的完整信息,或者您使用的数据结构不允许快速回答“我以前来过这里”的问题。
  4. 这种情况的一个例子是Dijkstra算法的一个简单实现,其优先级队列实现为二进制堆,或者使用简单的链表作为队列进行宽度优先搜索。在这些情况下,扫描队列以查找现有的插入是O(N),您可能不希望在每次迭代中都这样做。

在这种情况下,跟踪您已经获得的锁是很昂贵的。假设您想要在节点级别执行锁定,则重新进入锁定机制可以减轻判断您以前是否访问过某个节点的需要。您可以盲目地锁定节点,也许在弹出队列后将其解锁。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26542741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档