CopyOnWriteArrayList vs ArrayList

89
05 августа 2019, 07:30

Изучаю пакет java.util.concurrent. Перечитал куча статей, но никак не могу понять принципа потокобезопасности CopyOnWriteArrayList. Точнее принцип понял, что создается дубликат коллекции, и работа происходит именно с ней. Но на практике не могу это реализовать. Достойного примера не нашел. Вот в этой статье в примере понятно только то что при использовании CopyOnWriteArrayList при переборе итератором нельзя удалить элемент. Самый главный вопрос. В каких случаях мы можем использовать потокобезопасность CopyOnWriteArrayList вместо синхронизации. Буду признателен за любой пример.

Answer 1

ArrayList совместно с синхронизацией в каком-нибудь высоконагруженном приложении будет работать медленнее, чем CopyOnWriteArrayList, так как обычный ArrayList будет блокироваться каким-либо потоком целиком и будет недоступен для остальных потоков. При этом, CopyOnWriteArrayList не требует блокировок потоками, так как каждый поток будет работать со своей копией листа. При использовании CopyOnWriteArrayList, при переборе итератором удалять элемент можно. Но это не отразится на том переборе, в котором происходит удаление, если например будете делать вывод на экран и удалять элемент, то получите вывод на экран первоначального списка целиком. Вот здесь приведен достаточно понятный пример работы CopyOnWriteArrayList.

import java.util.List;
import java.util.Iterator;
import java.util.ArrayList;
import java.util.concurrent.CopyOnWriteArrayList;
public class CopyOnWriteArrayListExample
{
    List<String> list;
    public CopyOnWriteArrayListExample()
    {
        List<String> lst = new ArrayList<String>();
        lst.add("Java");
        lst.add("J2EE");
        lst.add("J2SE");
        lst.add("Collection");
        lst.add("Concurrent");
        list = new CopyOnWriteArrayList<String>(lst);
        System.out.println("ЦИКЛ с изменением");
        printCollection(true);
        System.out.println("\nЦИКЛ без изменением");
        printCollection(false);
    }
    private void printCollection(boolean change)
    {
        Iterator<String> iterator = list.iterator();
        while(iterator.hasNext()){
            String element = iterator.next();
            System.out.printf("  %s %n", element);
            if (change) { 
                if (element.equals("Collection")) {
                    list.add("Новая строка");
                    list.remove(element);
                }
            }
        }
    }
    public static void main(String args[]) 
    {
        new CopyOnWriteArrayListExample();
        System.exit(0);
    }
}

На выходе получите такой результат:

ЦИКЛ с изменением
  Java 
  J2EE 
  J2SE 
  Collection 
  Concurrent 
ЦИКЛ без изменением
  Java 
  J2EE 
  J2SE 
  Concurrent 
  Новая строка 
READ ALSO
Указание width, height в процентах

Указание width, height в процентах

Подскажите пожалуйста, нужна ваша точка зренияАдекватный ли тон на css верстке если вся ширина и высота указана в процентах?

108
Валидность :root

Валидность :root

Интересную особенность заметил

129
Vue.js скрывать navbar по скроллу

Vue.js скрывать navbar по скроллу

Есть следующий компонент:

133
Возможно ли прописать свое value в input type file?

Возможно ли прописать свое value в input type file?

Возможно ли добавить свои файлы в input type=file? Имеется ввиду, что записывается в value, когда файлы были добавлены? Тк

106