Ответ
CopyOnWriteArrayList — это потокобезопасная реализация интерфейса List из пакета java.util.concurrent, которая использует стратегию "копирования при записи".
Принцип работы:
- При каждой операции модификации (добавление, удаление, изменение) создается новая копия внутреннего массива.
- Операции чтения работают с неизменяемым снимком (snapshot) массива, сделанным на момент начала чтения.
Ключевые особенности:
- Потокобезопасность для чтения: Не требует синхронизации при итерации или чтении.
- Итераторы: Предоставляют снимок данных на момент создания итератора и не поддерживают операцию
remove(). - Производительность: Эффективен в сценариях, где операции чтения значительно преобладают над операциями записи.
- Память: Может потреблять больше памяти из-за частого копирования массива.
Пример использования:
import java.util.concurrent.CopyOnWriteArrayList;
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("A");
list.add("B");
// Итерация безопасна даже при параллельных модификациях
for (String item : list) {
System.out.println(item); // Чтение из snapshot
// list.add("C"); // Эта модификация не повлияет на текущую итерацию
}
Когда использовать: Для часто читаемых, редко изменяемых коллекций (например, списки слушателей событий, кэши конфигураций).