原文: https://beginnersbook.com/2013/12/how-to-synchronize-arraylist-in-java-with-example/
当我们在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 ArrayListsyncal.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 ArrayListal.add("Pen");al.add("NoteBook");al.add("Ink");System.out.println("Displaying synchronized ArrayList Elements:");//Synchronized block is not required in this methodIterator<String> iterator = al.iterator();while (iterator.hasNext())System.out.println(iterator.next());}}
输出:
Displaying synchronized ArrayList Elements:PenNoteBookInk
