Синхронизация доступа к ArrayList в Java
Принцип синхронизации мы объясняли ранее, когда говорили о разнице между Vector и ArrayList. ArrayList не синхронизирован и никогда не должен использоваться в многопоточной среде без синхронизации.Есть два способа синхронизации:
- Используйте метод Collections.synchronizedList()
- Используйте защищенную версию ArrayList: CopyOnWriteArrayList
1) синхронизировать ArrayList с Collections.synchronizedList()
Здесь важно отметить, что итератор должен находиться внутри синхронизированного блока, как показано в примере ниже:
import java.util.ArrayList;Runtime:
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
public class ArrayListSynchronized{
public static void main(String[] args) {
// Создаем ArrayList< Строка> synchronized
список< Строка> slist = Collections.synchronizedList(new ArrayList< Строка> ());
//добавляем элементы в ArrayList
slist.add("1");
slist.add("5");
slist.add("2");
slist.add("7");
System.out.println("просмотр синхронизированного списка:");
synchronized(slist) {
Iterator< Строка> iterator = slist.iterator();
while (iterator.hasNext())
System.out.println(iterator.next());
}
}
}
browse synchronized list:
1
5
2
7
2) Использование CopyOnWriteArrayList
импорт java.util.Iterator;Run:
public class CopyOnWriteArrayList{
public static void main(String[] args) {
java.util.concurrent.CopyOnWriteArrayList< Строка> al =
новый java.util.concurrent.CopyOnWriteArrayList< Строка> ();
//добавляем элементы в ArrayList
al.add("notebook");
al.add("kit");
al.add("USB-накопитель");
al.add("calculator");
System.out.println("просмотр синхронизированного списка:");
Итератор< Строка> iterator = al.iterator();
while (iterator.hasNext())
System.out.println(iterator.next());
}
}
просмотр синхронизированного списка:
notebook
kit
USB флешка
калькулятор