3

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

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

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

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

澄清问题:

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

1 回答 1

1

不妨更好地搜索: 这应该会有所帮助

重入锁的一个用例:

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

  1. 您有一些计算涉及遍历图形的算法(可能其中包含循环)。由于循环或由于到同一节点的多条路径,遍历可能会多次访问同一节点。

  2. 数据结构受到并发访问的影响,并且可能由于某种原因被更新,可能由另一个线程进行。您需要能够锁定各个节点以处理由于竞争条件导致的潜在数据损坏。出于某种原因(可能是性能),您不想全局锁定整个数据结构。

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

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

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

于 2014-10-24T06:54:28.810 回答