我有一个 Java 应用程序,它有工作线程来处理作业。一个工人产生一个结果对象,比如:
class WorkerResult{
private final Set<ResultItems> items;
public Worker(Set<ResultItems> pItems){
items = pItems;
}
}
当工作人员完成时,它会执行以下操作:
...
final Set<ResultItems> items = new SomeNonThreadSafeSetImplSet<ResultItems>();
for(Item producedItem : ...){
items.add(item);
}
passToGatherThread(items);
该items
集合在这里是一种“工作单元”。该passToGatherThread
方法将items
集合传递给一个收集线程,其中只有一个在运行时存在。
这里不需要同步,因为只有一个线程(Gather-thread)读取items
集合,所以不会发生竞争条件。AFAICS,Gather-thread 可能看不到所有项目,因为该集合不是线程安全的,对吧?
假设我无法进行passToGatherThread
同步,比如说因为它是第 3 方库。我基本上担心的是,由于缓存、VM 优化等原因,收集线程看不到所有项目。所以问题来了:如何以线程安全的方式传递项目集,以便收集线程“看到”正确的项目集?