当我们在Vector
vs ArrayList
上共享教程时,我们已经讨论了一些关于同步的问题。我们知道ArrayList
是非同步的,不应在没有显式同步的多线程环境中使用。这篇文章将讨论如何在 Java 中同步ArrayList
。
显式同步有两种方法:
- 使用
Collections.synchronizedList()
方法 - 使用
ArrayList
的线程安全变体:CopyOnWriteArrayList
示例 1:用于同步ArrayList
的Collections.synchronizedList()
方法
在这个例子中,我们使用 Collections.synchronizedList()
方法。这里要注意的重点是迭代器应该在这种类型的同步中处于同步块中,如下例所示。
package beginnersbook.com;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Collections;
public class Details {
public static void main(String a[]){
List<String> syncal =
Collections.synchronizedList(new ArrayList<String>());
//Adding elements to synchronized ArrayList
syncal.add("Pen");
syncal.add("NoteBook");
syncal.add("Ink");
System.out.println("Iterating synchronized ArrayList:");
synchronized(syncal) {
Iterator<String> iterator = syncal.iterator();
while (iterator.hasNext())
System.out.println(iterator.next());
}
}
}
输出:
Iterating synchronized ArrayList:
Pen
NoteBook
Ink
方法 2:使用CopyOnWriteArrayList
CopyOnWriteArrayList 是ArrayList
的线程安全变体。
package beginnersbook.com;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.Iterator;
public class Details {
public static void main(String a[]){
CopyOnWriteArrayList<String> al = new CopyOnWriteArrayList<String>();
//Adding elements to synchronized ArrayList
al.add("Pen");
al.add("NoteBook");
al.add("Ink");
System.out.println("Displaying synchronized ArrayList Elements:");
//Synchronized block is not required in this method
Iterator<String> iterator = al.iterator();
while (iterator.hasNext())
System.out.println(iterator.next());
}
}
输出:
Displaying synchronized ArrayList Elements:
Pen
NoteBook
Ink