JavaでArrayListへのアクセスを同期する

同期の原理については、先ほど Vector と ArrayList の違いについて説明したときに説明しました。ArrayList は同期されていないため、同期のないマルチスレッド環境では使用しないでください。

同期するには 2 つの方法があります。
  1. メソッド Collections.synchronizedList()
  2. 保護されたバージョンを使用する配列リスト: CopyOnWriteArrayList

1) ArrayList を Collections.synchronizedList()

同期しますここで注意すべき重要な点は、以下の例に示すように、イテレータが同期ブロック内にある必要があることです:

importjava.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(新しい ArrayList<文字列>());

//ArrayList に項目を追加
slist.add("1");
slist.add("5");
slist.add("2");
slist.add("7");

System.out.println("同期リストの参照:");
synchronized(slist) {
イテレータ<文字列>イテレータ = slist.iterator();
while (iterator.hasNext())
System.out.println(iterator.next());
}
}
}
Runtime:

browse synchronized list:
1
5
2
7

2) CopyOnWriteArrayList

import java.util.Iterator;

public class CopyOnWriteArrayList{

public static void main(String[] args) {

java.util.concurrent.CopyOnWriteArrayList<文字列>al =
new java.util.concurrent.CopyOnWriteArrayList<文字列>();

//ArrayList に項目を追加します
al.add("notebook");
al.add("キット");
al.add("USBメモリ");
al.add("電卓");

System.out.println("同期リストの参照:");
イテレータ<文字列>イテレータ = al.iterator();
while (iterator.hasNext())
System.out.println(iterator.next());
}
}
Run:

browse synchronized list:
notebook
kit
USB stick
calculator