企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 如何在 java 中同步`ArrayList` > 原文: [https://beginnersbook.com/2013/12/how-to-synchronize-arraylist-in-java-with-example/](https://beginnersbook.com/2013/12/how-to-synchronize-arraylist-in-java-with-example/) 当我们在[`Vector` vs `ArrayList`](https://beginnersbook.com/2013/12/difference-between-arraylist-and-vector-in-java/) 上共享教程时,我们已经讨论了一些关于同步的问题。我们知道`ArrayList`是非同步的,不应在没有显式同步的多线程环境中使用。这篇文章将讨论如何在 Java 中同步`ArrayList`。 **显式同步有两种方法:** 1. 使用`Collections.synchronizedList()`方法 2. 使用`ArrayList`的线程安全变体:`CopyOnWriteArrayList` ### 示例 1:用于同步`ArrayList`的`Collections.synchronizedList()`方法 在这个例子中,我们使用 [`Collections.synchronizedList()`](https://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#synchronizedList(java.util.List))方法。这里要注意的重点是迭代器应该在这种类型的同步中处于同步块中,如下例所示。 ```java 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()); } } } ``` 输出: ```java Iterating synchronized ArrayList: Pen NoteBook Ink ``` ### 方法 2:使用`CopyOnWriteArrayList` [CopyOnWriteArrayList](https://docs.oracle.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.html) 是`ArrayList`的线程安全变体。 ```java 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()); } } ``` 输出: ```java Displaying synchronized ArrayList Elements: Pen NoteBook Ink ```