让线程 A 阻塞 B & C,反之亦然,但不让线程 B 阻塞线程 C,反之亦然?

Let thread A block B & C and vice versa, but not let thread B block thread C and vice versa?

我有一个问题,我有一个数据结构和多个线程试图对其进行操作。说得越简单越好:我有线程A、B和C,线程A只能做它的操作,只要B和C不对数据集做任何改变。 B 和 C 大部分时间都可以同时在设备上操作。所以目标是:

问题是,我怎样才能做到这一点? 我希望很清楚我想做什么。如果没有,请随时发表评论。我故意没有提供任何代码,因为我认为这样更容易理解问题(很多长代码)。

您需要使您的对象线程安全。

简而言之,你必须:

  1. 将您的字段设为私有
  2. 找到你的批评部分并用 synchronized bloc
  3. 保护它们

在此page中很好地恢复了概念并解释了其他方法。

一旦您的字段在基本 CRUD 操作(创建、读取、更新、删除)上得到正确保护,您就可以创建专门用于为线程 B 和 C 以及线程 A 的其他线程读取数据的特定方法

您可以使用ReentrantReadWriteLock

您想使用具有 2 个许可的 Semaphore。

您的 A 线程将始终请求两个许可 (acquire(2))。

您的 B 和 C 线程将只请求一个许可 (acquire())。

这样 B 和 C 就可以始终一起工作,A 将阻止 B 或 C(因为没有许可者可用)。 B或C将阻止A,因为只剩下一张许可证。

它适用于任何已知数量的 (B,C) 线程,因为信号量可以设置为该数量。主要问题是如果 B 和 C 总是获得一张许可证,A 可能会饿死。 因此,如果 N = nr(B)+nr(C),则类型 A 的任何线程都需要 (N)。它不适用于未知数量的 B、C,因为信号量允许数量不能动态增加。