我有一个生成对象并将其放入共享队列的生产者线程。
我已经产生了一堆可以从这个队列中读取的消费者线程。
在理想情况下,我的每个工人都会从队列中接下一份工作。但是对于某些对象(具有特定属性),我的每个消费者线程都需要该对象的副本(没有任何重复)。
我的第一个冲动是在每次推送到队列之前检查对象的该属性。如果该属性存在,则制作 n 个副本(这里 n 等于我拥有的工人数)并将这 n 个副本推送到队列中。
队列需要做一些记账,以防止同一个工作人员多次获得对象。
进行这种簿记的一种方法是拥有一个 Map,其中键是对象,值是一组 worker-id(它可以是 thread-id)。
对于每个弹出请求,队列将检查对象是否已被当前线程 ID 处理。如果 map 中存在 thread-id,它将退出临界区而不从队列中弹出对象,否则它将弹出对象并更新映射。
这种方法的问题在于,单个线程很可能会使其他线程无法访问队列。
有人可以提出一个优雅的方法来解决这个问题吗?
谢谢