У меня есть приложение 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
, скажем, потому что это сторонняя библиотека. Я в основном опасаюсь, что поток сборок не видит всех элементов из-за кеширования, оптимизации виртуальной машины и т.д. Итак, возникает вопрос: как передать элементы, заданные поточно-безопасным способом, так что поток Gather "видит", правильный набор элементов?