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

问题描述 投票:4回答:3

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

  • 线程A阻止B&C
  • 线程B&C块A.
  • 线程B不会阻塞C(反之亦然)

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

java multithreading concurrency locking
3个回答
2
投票

你可以使用ReentrantReadWriteLock


2
投票

你想使用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,因为信号量允许数量不能动态增加。


-1
投票

您需要使对象线程安全。

总之,你必须:

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

在这个page非常好地恢复这个概念并解释其他方法。

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

© www.soinside.com 2019 - 2024. All rights reserved.