在 Java 中同步对 ArrayList 的访问
我们之前在谈到 Vector 和 ArrayList 之间的区别时解释了同步的原理。ArrayList 未同步,不应在没有同步的情况下在多线程环境中使用。有两种同步方法:
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());
}
}
}
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 =
new java.util.concurrent.CopyOnWriteArrayList<字符串>();
//在 ArrayList
al.add(notebook”);
al.add(套件”);
al.add(U盘”);
al.add(计算器”);
System.out.println(浏览同步列表:”);
迭代器<字符串>迭代器 = al.iterator();
while (iterator.hasNext())
System.out.println(iterator.next());
}
}
browse synchronized list:
notebook
kit
U盘
calculator