让线程 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 大部分时间都可以同时在设备上操作。所以目标是:
- 线程 A 阻塞 B 和 C
- 线程 B 和 C 块 A
- 线程 B 不会阻塞 C(反之亦然)
问题是,我怎样才能做到这一点?
我希望很清楚我想做什么。如果没有,请随时发表评论。我故意没有提供任何代码,因为我认为这样更容易理解问题(很多长代码)。
您需要使您的对象线程安全。
简而言之,你必须:
- 将您的字段设为私有
- 找到你的批评部分并用
synchronized
bloc 保护它们
在此page中很好地恢复了概念并解释了其他方法。
一旦您的字段在基本 CRUD 操作(创建、读取、更新、删除)上得到正确保护,您就可以创建专门用于为线程 B 和 C 以及线程 A 的其他线程读取数据的特定方法
您想使用具有 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,因为信号量允许数量不能动态增加。
我有一个问题,我有一个数据结构和多个线程试图对其进行操作。说得越简单越好:我有线程A、B和C,线程A只能做它的操作,只要B和C不对数据集做任何改变。 B 和 C 大部分时间都可以同时在设备上操作。所以目标是:
- 线程 A 阻塞 B 和 C
- 线程 B 和 C 块 A
- 线程 B 不会阻塞 C(反之亦然)
问题是,我怎样才能做到这一点? 我希望很清楚我想做什么。如果没有,请随时发表评论。我故意没有提供任何代码,因为我认为这样更容易理解问题(很多长代码)。
您需要使您的对象线程安全。
简而言之,你必须:
- 将您的字段设为私有
- 找到你的批评部分并用
synchronized
bloc 保护它们
在此page中很好地恢复了概念并解释了其他方法。
一旦您的字段在基本 CRUD 操作(创建、读取、更新、删除)上得到正确保护,您就可以创建专门用于为线程 B 和 C 以及线程 A 的其他线程读取数据的特定方法
您想使用具有 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,因为信号量允许数量不能动态增加。