原文: https://beginnersbook.com/2013/12/how-to-synchronize-arraylist-in-java-with-example/

当我们在Vector vs ArrayList 上共享教程时,我们已经讨论了一些关于同步的问题。我们知道ArrayList是非同步的,不应在没有显式同步的多线程环境中使用。这篇文章将讨论如何在 Java 中同步ArrayList

显式同步有两种方法:

  1. 使用Collections.synchronizedList()方法
  2. 使用ArrayList的线程安全变体:CopyOnWriteArrayList

示例 1:用于同步ArrayListCollections.synchronizedList()方法

在这个例子中,我们使用 Collections.synchronizedList())方法。这里要注意的重点是迭代器应该在这种类型的同步中处于同步块中,如下例所示。

  1. package beginnersbook.com;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. import java.util.Collections;
  6. public class Details {
  7. public static void main(String a[]){
  8. List<String> syncal =
  9. Collections.synchronizedList(new ArrayList<String>());
  10. //Adding elements to synchronized ArrayList
  11. syncal.add("Pen");
  12. syncal.add("NoteBook");
  13. syncal.add("Ink");
  14. System.out.println("Iterating synchronized ArrayList:");
  15. synchronized(syncal) {
  16. Iterator<String> iterator = syncal.iterator();
  17. while (iterator.hasNext())
  18. System.out.println(iterator.next());
  19. }
  20. }
  21. }

输出:

  1. Iterating synchronized ArrayList:
  2. Pen
  3. NoteBook
  4. Ink

方法 2:使用CopyOnWriteArrayList

CopyOnWriteArrayListArrayList的线程安全变体。

  1. package beginnersbook.com;
  2. import java.util.concurrent.CopyOnWriteArrayList;
  3. import java.util.Iterator;
  4. public class Details {
  5. public static void main(String a[]){
  6. CopyOnWriteArrayList<String> al = new CopyOnWriteArrayList<String>();
  7. //Adding elements to synchronized ArrayList
  8. al.add("Pen");
  9. al.add("NoteBook");
  10. al.add("Ink");
  11. System.out.println("Displaying synchronized ArrayList Elements:");
  12. //Synchronized block is not required in this method
  13. Iterator<String> iterator = al.iterator();
  14. while (iterator.hasNext())
  15. System.out.println(iterator.next());
  16. }
  17. }

输出:

  1. Displaying synchronized ArrayList Elements:
  2. Pen
  3. NoteBook
  4. Ink