Синхронизация доступа к ArrayList в Java

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

Есть два способа синхронизации:
  1. Используйте метод Collections.synchronizedList()
  2. Используйте защищенную версию ArrayList:  CopyOnWriteArrayList

1) синхронизировать ArrayList с Collections.synchronizedList()

Здесь важно отметить, что итератор должен находиться внутри синхронизированного блока, как показано в примере ниже:

import java.util.ArrayList; 
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());
}
}
}
Runtime:

browse synchronized list:
1
5
2
7

2) Использование CopyOnWriteArrayList

импорт java.util.Iterator; 

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());
}
}
Run:

просмотр синхронизированного списка:
notebook
kit
USB флешка
калькулятор