我有一个问题,我有一个数据结构和多个线程试图对它进行操作。说它尽可能简单:我有线程A,B和C.线程A只能执行其操作,只要B和C不对数据集进行任何更改。 B和C可以在大多数时间同时在设置上运行。所以目标是:
问题是,我怎样才能实现这一目标? 我希望我很清楚我想要做什么。如果没有,请随时发表评论。我故意不提供任何代码,因为在我看来这种方式更容易掌握问题(很多长代码)。
答案 0 :(得分:2)
答案 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)
您需要使对象线程安全。
简而言之,你必须:
synchronized
bloc 在这个page中很好地恢复了这个概念并解释了其他方法。
一旦您的字段在基本CRUD操作(创建,读取,更新,删除)上得到正确保护,您就可以使特定方法专门用于读取线程B和B的数据。线程A的C和其他人