ReentrantLock 允许线程递归地获取相同的锁,因此锁计数在连续的锁定/解锁时递增和递减。而在释放给其他线程之前,锁计数必须递减为零。
为什么或在什么情况下我会编写递归获取锁的代码?
我认为拥有该功能的唯一一点是方便我们编写递归代码,其中递归调用方法(在其执行过程中获取锁)。
在任何其他情况下,线程递归/重复获取锁是否有用?
问题的澄清:
- 请忽略正在重入的锁。恰好递归性是由可重入锁提供的。
- 我指的是锁的递归特性
- 请不要回答为什么使用可重入锁。
- 请不要回答“递归不是可重入锁的主要特征”
- 我想知道什么情况下需要递归获取锁,无论锁是否可重入。
最佳答案
还不如搜索更好: this should be helpful
可重入锁定的用例:
可重入锁的一个(有点通用和做作的)应用示例可能是:
你有一些涉及遍历 a 的算法的计算 图(可能有循环)。一次遍历可能访问同一个 由于循环或由于多条路径到 同一个节点。
数据结构受并发访问的影响,可以是 出于某种原因更新,也许是由另一个线程。你需要成为 能够锁定单个节点以处理潜在的数据损坏 由于竞争条件。由于某种原因(也许是性能)你 不想全局锁定整个数据结构。
您的计算无法保留关于哪些节点的完整信息 您访问过,或者您使用的数据结构不允许 快速回答“我以前来过这里吗”的问题。
这种情况的一个例子是一个简单的实现 Dijkstra 算法,优先级队列实现为二进制 堆或使用简单链表作为队列的广度优先搜索。 在这些情况下,扫描现有插入队列的时间复杂度为 O(N) 而且您可能不想在每次迭代时都这样做。
在这种情况下,跟踪您已经拥有的锁 收购是昂贵的。假设您想在节点上进行锁定 级别重入锁定机制减轻了告诉的需要 你之前是否访问过一个节点。你可以盲目地锁定 节点,也许在您将其从队列中弹出后将其解锁。
关于java - 为什么要递归地获取(可重入)锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26542741/