具有多个对象/锁的 Java 同步

标签 java multithreading concurrency 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 个。(我看到了一个使用固定数量的锁来解决这个问题的优雅解决方案,但不确定我是否可以在这里应用它。)
  • 显然,我希望每个线程同时获取所有需要的锁以防止死锁。

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

非常感谢。

最佳答案

第一步

为您的资源提供自然排序。例如,如果您的资源是字母,A 将出现在 B 之前,B 将出现在 C 之前,并且等等。

第 2 步

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

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

示例

  • 线程 1 需要锁定资源 ABDE
  • 线程 2 需要锁定资源 BE

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

关于具有多个对象/锁的 Java 同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21739080/

相关文章:

c++ - 在 C++ 中测试和测试并设置

c - 仅跨 2 个线程进行 NULL 检查是线程安全的吗?

C: 如何使用 POSIX 线程声明递归互斥体?

multithreading - 如何使信号量超时

java - 从 Eclipse 类路径中排除项目引用的传递依赖关系的问题

java - 为 GAE maven 项目添加 java 方面

java - 实例化内部类

java - Eclipse 在 Ubuntu 上卡住 UI

java - Java的notify-wait机制应该怎么调用?

go - 为什么atomic.Value不能在第一个Store之后复制?