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

时间:2014-10-24 06:41:13

标签: java multithreading recursion reentrantlock

ReentrantLock允许线程以递归方式获取相同的锁,以便锁定计数在连续锁定/解锁时递增和递减。锁定计数必须在释放到其他线程之前递减到零。

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

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

是否还有其他情况可以通过线程递归/重复获取锁定?

澄清问题:

  • 请忽略可重入的锁定。恰好相反,递归性由重入锁提供。
  • 我指的是锁的递归功能
  • 请不要回答为什么要使用折返锁。
  • 请不要回答“递归不是折返锁定的主要特征”
  • 我想知道哪些情况需要递归获取锁,无论锁是否可重入。

1 个答案:

答案 0 :(得分:1)

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

重入锁定的用例:

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

  1. 你有一些涉及遍历a的算法的计算 图(可能包含周期)。遍历也可以访问 由于循环或由于多个路径而导致节点不止一次 同一节点。

  2. 数据结构可以同时访问,也可以 由于某种原因更新,可能是由另一个线程。你需要 能够锁定单个节点以处理潜在的数据损坏 由于竞争条件。出于某种原因(也许表现)你 不希望全局锁定整个数据结构。

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

  4. 这种情况的一个例子是一个简单的实现 Dijkstra的算法,优先级队列实现为二进制 使用简单链接列表作为队列进行堆或广度优先搜索。 在这些情况下,扫描队列以查找现有插入是O(N) 你可能不希望每次迭代都这样做。

  5. 在这种情况下,跟踪你已经锁定的内容    获得的是昂贵的。假设你想在节点上进行锁定    一个可重入的锁定机制减轻了告诉的需要    你以前是否曾访问过一个节点。你可以盲目地锁定    节点,可能在您将其从队列中弹出后将其解锁。