Изучаю пакет java.util.concurrent. Перечитал куча статей, но никак не могу понять принципа потокобезопасности CopyOnWriteArrayList. Точнее принцип понял, что создается дубликат коллекции, и работа происходит именно с ней. Но на практике не могу это реализовать. Достойного примера не нашел. Вот в этой статье в примере понятно только то что при использовании CopyOnWriteArrayList при переборе итератором нельзя удалить элемент. Самый главный вопрос. В каких случаях мы можем использовать потокобезопасность CopyOnWriteArrayList вместо синхронизации. Буду признателен за любой пример.
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
Новая строка
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Подскажите пожалуйста, нужна ваша точка зренияАдекватный ли тон на css верстке если вся ширина и высота указана в процентах?
Возможно ли добавить свои файлы в input type=file? Имеется ввиду, что записывается в value, когда файлы были добавлены? Тк