Потокобезопасная очистка CopyOnWriteArrayList после обработки
У меня есть программа на Java, использующая CopyOnWriteArrayList
который проходит через update()
метод в потоке, который выполняется в определенный интервал времени и обрабатывает каждый элемент в списке. Элементы в списке не являются потокобезопасными, поэтому я обрабатываю модификации элементов, используя различные CopyOnWriteArrayList
буферы, которые используются, чтобы знать, какие элементы изменить и как, когда update()
Метод перебирает список.
Проблема в том, что как только я использовал эти буферы, я clear()
их, но я боюсь, что элемент может быть добавлен в буфер между тем, когда буфер используется и когда он очищен.
Например:
mainList.addAll(bufferAddList);
bufferAddList.clear();
Пример 2:
for (Item item : mainList) { // Main iterator loop
if (bufferModItemList.contains(item)) {
item.modify();
}
// Do other stuff
}
bufferModItemList.clear();
Боюсь что с помощью synchronize
вокруг блоков кода, которые читают / изменяют эти списки, приведет к блокировке основного потока (откуда поступают вызовы к изменениям), потому что обработка, которая происходит во время итерации по элементам, занимает некоторое время (скрипты Python вызываются и ожидаются). Вот почему я использую буферы в первую очередь.
Есть ли лучший способ сделать это, чем любой из способов, которые я упомянул?
Обратите внимание, что оба примера показывают код, который будет работать в update()
метод, который находится в "бесконечном" цикле while потока.
ОБНОВИТЬ
Похоже, что с помощью ConcurrentLinkedQueue
решит проблему с примером 2. Однако, кажется, что использовать его для первого примера было бы излишним, так как я просто хочу добавить все узлы к mainList
, Было бы здорово, если ConcurrentLinkedQueue
был .pollAll()
метод!
Кроме того, в следующем примере мне придется итеративно удалять элементы из mainList
что я не хочу делать, так как это CopyOnWriteArrayList
, Хотя я не уверен, что это должен быть один больше...
Пример 3:
mainList.removeAll(bufferRemoveList);
bufferRemoveList.clear();