我有一个问题,我有一个数据结构和多个线程试图对它进行操作。说它尽可能简单:我有线程A,B和C.线程A只能执行其操作,只要B和C不对数据集进行任何更改。 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读取数据