ReentrantLock允许线程以递归方式获取相同的锁,以便锁定计数在连续锁定/解锁时递增和递减。锁定计数必须在释放到其他线程之前递减到零。
为什么或在什么情况下我会编写代码来递归获取锁?
我能看到的唯一一点就是使我们能够方便地编写递归代码,其中一个方法(在执行过程中获取一个锁)被递归调用。
是否还有其他情况可以通过线程递归/重复获取锁定?
答案 0 :(得分:1)
不妨更好地搜索: this should be helpful
可重入锁定的应用程序的一个(有点通用和做作)的例子可能是:
你有一些涉及遍历a的算法的计算 图(可能包含周期)。遍历也可以访问 由于循环或由于多个路径而导致节点不止一次 同一节点。
数据结构可以同时访问,也可以 由于某种原因更新,可能是由另一个线程。你需要 能够锁定单个节点以处理潜在的数据损坏 由于竞争条件。出于某种原因(也许表现)你 不希望全局锁定整个数据结构。
您的计算无法保留有关哪些节点的完整信息 您访问过,或者您使用的是不允许的数据结构 “我以前来过这里”的问题要快速回答。
这种情况的一个例子是一个简单的实现 Dijkstra的算法,优先级队列实现为二进制 使用简单链接列表作为队列进行堆或广度优先搜索。 在这些情况下,扫描队列以查找现有插入是O(N) 你可能不希望每次迭代都这样做。
在这种情况下,跟踪你已经锁定的内容 获得的是昂贵的。假设你想在节点上进行锁定 一个可重入的锁定机制减轻了告诉的需要 你以前是否曾访问过一个节点。你可以盲目地锁定 节点,可能在您将其从队列中弹出后将其解锁。