Потокобезопасная очистка 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(); 

0 ответов

Другие вопросы по тегам