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

时间:2015-04-10 12:32:26

标签: java multithreading concurrency locking

我有一个问题,我有一个数据结构和多个线程试图对它进行操作。说它尽可能简单:我有线程A,B和C.线程A只能执行其操作,只要B和C不对数据集进行任何更改。 B和C可以在大多数时间同时在设置上运行。所以目标是:

  • 线程A阻止B& ç
  • 线程B& C区块A
  • 线程B不阻止C(反之亦然)

问题是,我怎样才能实现这一目标? 我希望我很清楚我想要做什么。如果没有,请随时发表评论。我故意不提供任何代码,因为在我看来这种方式更容易掌握问题(很多长代码)。

3 个答案:

答案 0 :(得分:2)

您可以使用ReentrantReadWriteLock

答案 1 :(得分:2)

你想使用Semaphore有2个许可证。

你的A线程将总是要求两个许可证(获得(2))。

你的B和C线程只会要求一个许可证(acquire())。

这样B和C总是可以工作,A将阻止B或C(因为没有可用的permists)。 B或C将阻止A,因为只剩下一个许可证。

它适用于任何已知数量的(B,C)线程,因为信号量可以设置为此数字。主要问题是A的潜在饥饿,如果B和C将始终获得一个许可。 因此,如果N = nr(B)+ nr(C),那么类型A的任何线程都需要(N)。它不适用于未知数量的B,C,因为信号量允许数量不能动态增加。

答案 2 :(得分:-1)

您需要使对象线程安全。

简而言之,你必须:

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

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

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