当我们在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:PenNoteBookInk
方法 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:PenNoteBookInk
