【发布时间】:2014-03-11 10:28:36
【问题描述】:
我想知道是否有包或模型可以帮助我解决这种情况。
假设我有 3 个线程和一堆对象 A、B、C、D、E、F
- T1 需要锁 A、B
- T2 需要锁 B、C、D
- T3 需要 E、F 锁
在这种情况下,如果 T1 和 T3 同时运行就可以了。此外,T2 和 T3 可以同时运行。但是 T1 和 T2 绝不应该同时运行。
另外,请注意
- 线程可以获得任意数量的锁,而不仅仅是 2 个。(我看到了一个用固定数量的锁解决这个问题的优雅解决方案,但不确定我是否可以在这里应用它。)
- 显然,我希望每个线程同时获取所有需要的锁以防止死锁。
如果有人可以向我指出支持此用例的软件包,或一些解决此问题的代码 sn-p,请告诉我。
非常感谢。
【问题讨论】:
-
您确定不能将其简化为需要更少的并发锁吗?
-
这听起来非常复杂且容易出错,但请看java.util.concurrent.locks。
-
我认为您可以通过确保始终在 A 或 C+D 之前获取 B 并始终在释放 B 之前释放 C+D 或 A 来避免死锁。
-
您提出的方案不可能导致死锁。没有周期。
-
不幸的是,情况就是这样。锁定对象是系统中数千个“事物”的 ID。线程将同时处理这些事物的组,并且无法保证哪些事物或多少会被处理
标签: java multithreading concurrency synchronization locks