JavaでArrayListへのアクセスを同期する
同期の原理については、先ほど Vector と ArrayList の違いについて説明したときに説明しました。ArrayList は同期されていないため、同期のないマルチスレッド環境では使用しないでください。同期するには 2 つの方法があります。
- メソッド Collections.synchronizedList()
- 保護されたバージョンを使用する配列リスト: CopyOnWriteArrayList
1) ArrayList を Collections.synchronizedList()
同期しますここで注意すべき重要な点は、以下の例に示すように、イテレータが同期ブロック内にある必要があることです:
importjava.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(新しい 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());
}
}
}
browse synchronized list:
1
5
2
7
2) CopyOnWriteArrayList
import java.util.Iterator;Run:
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());
}
}
browse synchronized list:
notebook
kit
USB stick
calculator