2014-10-09 2 views
1

Я вызываю только addAll и освобождаюсь от списка, но нуждаюсь в потокобезопасности, есть ли существующий список для этого? ThanksКакой список java подходит для потокобезопасности на addAll и очищается

+1

«поточно-безопасный» - это большой термин. Если два потока одновременно называют addAll, достаточно ли этого, чтобы не получить «ConcurrentModificationException», или вам нужны все элементы из 1-го потока, добавленного до элементов со второго? – Mureinik

+0

Вам действительно нужно добавить более подробную информацию о сценарии, если вы хотите получить высококачественный, конкретный ответ. – biziclop

ответ

1

Список не синхронизирован. Таким образом, он не является потокобезопасным. Если вы хотите как потокобезопасный означает, что можно сделать список как потокобезопасный, вы можете использовать

Collections.synchronizedList(List list)

1

список, созданный с использованием Collections.synchronizedList(List list) будет удовлетворять эти требования, при условии что Синхронизированный список - это целевой объект в вызове addAll(...), и никогда не параметр.

Если синхронизированный список (созданный, как указано выше) является аргументом, то проблема заключается в том, что addAll(list) выполняет итерацию аргумента list, а итерация синхронизированного списка не является атомарной. Если другой поток обновляет list, пока он добавляется, вы можете получить ConcurrentModificationException.

Если вам нужно сделать addAll(list) в поточно-моды в условиях одновременных обновлений для list, то вам нужно сделать listCopyOnWriteArrayList.

0

Если вы хотите использовать список exsting, как синхронизируются один, пойти на Collections.synchronizedList(list) или вы создаете список целевой, то вы можете пойти на CopyOnWriteArrayList

-1

CopyOnWriteArrayList является одновременно заменой synchronizedList, что обеспечивает лучший параллелизм в некоторых типичных ситуациях & устраняет необходимость блокировки или копирования коллекции во время итерации.

Копирование на коллекциях записей обеспечивает безопасность потоков от того факта, что как эффективно неизменяемый объект публикуется должным образом, дальнейшая синхронизация не требуется при доступе к нему. Они реализуют изменчивость, создавая &, повторно публикуя новую копию коллекции каждый раз, когда она изменяется. Коллекция не бросает ConcurrentModificationException, независимо от последующих изменений.

Смежные вопросы