Java 与多个对象/锁的同步

kan*_*ane 4 java concurrency multithreading synchronization locks

我想知道是否有一个包或模型可以帮助我解决这种情况。

假设我有 3 个线程和一堆对象 A、B、C、D、E、F

  • T1需要锁A、B
  • T2需要锁B、C、D
  • T3需要锁E、F

在这种情况下,如果 T1 和 T3 同时运行就可以了。此外,T2 和 T3 可以同时运行。但 T1 和 T2 永远不应该同时运行。

另外,请注意

  • 线程可以获得任意数量的锁,而不仅仅是 2 个。(我看到了一个使用固定数量的锁来解决这个问题的优雅解决方案,但不确定我是否可以在这里应用它。)
  • 显然,我希望每个线程同时获取所有需要的锁以防止死锁。

如果有人可以向我指出支持此用例的包,或解决此问题的一些代码片段,请告诉我。

非常感谢。

Rai*_*olt 5

步骤1

为您的资源提供自然的排序。例如,如果您的资源是信件,A则会出现在 之前BB会出现在 之前C,依此类推。

第2步

只允许你的线程按顺序获取资源。

现在你的线程在任何情况下都不可能陷入死锁。

例子

  • 线程 1 需要锁定资源A, B, D, 和E
  • 线程 2 需要锁定资源B并且E

我们的线程必须争夺资源BD. 因为我们强制执行了自然顺序,所以保证首先获得锁的线程B能够获得锁D并顺利进行。失败的线程将等待B被释放。