2

我有一组ReentrantLocks具有唯一整数 id 的包装,我要求线程在获取更高 id 锁之前获取更低 id 锁,以防止死锁。其中三个锁(lock0、lock1 和 lock2)的优先级高于 id 较高的锁,而所有其他锁具有相同的优先级 - 这意味着如果一个线程获取这三个高优先级锁之一,那么它们需要中断持有必要低优先级锁的其他线程。例如,Thread1 持有 lock4 和 lock5,而 Thread0 持有 lock0 并需要 lock4 和 lock5,所以 Thread0 中断 Thread1(它使用它获取锁lockInterruptibly并且偶尔会查询它的锁)isInterrupted方法)并获取它的锁。Thread1 一直等待,直到 Thread0 发出信号(即它不会尝试重新获取锁,直到 Thread0 完成它们)。

由于几个原因,这并不理想。理想情况下,我希望 Thread0 立即发出信号,表示它需要锁,这样其他线程就不会向前跳转并在 Thread1 处理中断 Thread0 时获取锁(即 Thread0 进入等待线程的队列,这样如果 Thread2 尝试在 Thread0 中断 Thread1 时获取锁,然后 Thread0 仍将在 Thread2 之前获得锁) - 例如,我想要一个tryLock如果另一个线程持有锁,则将线程添加到锁的队列中。此外,目前如果有线程在 lock4 或 lock5 上排队,那么 Thread0 必须等待它们获取锁然后中断它们 - 如果 Thread0 可以清空锁上的等待队列会更好(假设没有等待线程持有高优先级锁)。最后,Thread1 没有必要放弃它所有的锁:如果 Thread0 想要 lock0 和 lock5 而 Thread1 想要 lock4 和 lock5,那么 Thread1 不需要放弃它对 lock4 的锁,但lockInterruptibly会导致线程中断时放弃所有锁(假设线程在等待获取锁时被中断)。

在我重新发明轮子之前,我想知道是否有一个锁类已经实现了一些/所有这些要求,某种PriorityReentrantLock或其他。我已经看过了AbstractQueuedSynchronizer,我认为修改它以满足我的需要不需要太多的工作(特别是因为我只需要两个优先级),但是我需要测试的新代码更少更好的。

4

0 回答 0