在 Java 中同步对 ArrayList 的访问

我们之前在谈到 Vector 和 ArrayList 之间的区别时解释了同步的原理。ArrayList 未同步,不应在没有同步的情况下在多线程环境中使用。

有两种同步方法:
  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());
}
}
}
运行时:

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

browse synchronized list:
notebook
kit
U盘
calculator