让线程A阻塞B&C,反之亦然,但不要让线程B阻塞线程C,反之亦然?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了让线程A阻塞B&C,反之亦然,但不要让线程B阻塞线程C,反之亦然?相关的知识,希望对你有一定的参考价值。
我有一个问题,我有一个数据结构和多个线程试图对它进行操作。说它尽可能简单:我有线程A,B和C.线程A只能执行其操作,只要B和C不对数据集进行任何更改。 B和C可以在大多数时间同时在设置上运行。所以目标是:
- 线程A阻止B&C
- 线程B&C块A.
- 线程B不会阻塞C(反之亦然)
问题是,我怎样才能做到这一点?我希望我很清楚我想要做什么。如果没有,请随时发表评论。我故意不提供任何代码,因为在我看来这种方式更容易掌握问题(很多长代码)。
答案
另一答案
你想使用Semaphore有2个许可证。
你的A线程将总是要求两个许可证(获得(2))。
你的B和C线程只会要求一个许可证(acquire())。
这样B和C总是可以一起工作,A将阻止B或C(因为没有许可证可用)。 B或C将阻止A,因为只剩下一个许可证。
它适用于任何已知数量的(B,C)线程,因为信号量可以设置为此数字。主要问题是A的潜在饥饿,如果B和C将始终获得一个许可。因此,如果N = nr(B)+ nr(C),那么类型A的任何线程都需要(N)。它不适用于未知数量的B,C,因为信号量允许数量不能动态增加。
另一答案
您需要使对象线程安全。
总之,你必须:
- 将您的字段设为私有
- 找到您的关键部分并使用
synchronized
集团保护它们
在这个page非常好地恢复这个概念并解释其他方法。
一旦您的字段在基本CRUD操作(创建,读取,更新,删除)上得到正确保护,您就可以使特定方法专门为线程B&C和其他线程A读取数据
以上是关于让线程A阻塞B&C,反之亦然,但不要让线程B阻塞线程C,反之亦然?的主要内容,如果未能解决你的问题,请参考以下文章