如何创建同步阵列列表

2022-09-03 16:29:52

我已经创建了像这样的同步数组列表

import java.text.SimpleDateFormat;
import java.util.*;


class HelloThread  
{

 int i=1;
 List arrayList;
  public  void go()
  {
 arrayList=Collections.synchronizedList(new ArrayList());
 Thread thread1=new Thread(new Runnable() {

  public void run() {
  while(i<=10)
  {
   arrayList.add(i);
   i++;
  }
  }
 });
 thread1.start();
 Thread thred2=new Thread(new Runnable() {
  public void run() {
     while(true)
     {
   Iterator it=arrayList.iterator();
      while(it.hasNext())
      {
       System.out.println(it.next());
      }
     }
  }
 });
 thred2.start();
  }
 }

public class test
{
  public static void main(String[] args)
  {
   HelloThread hello=new HelloThread();
   hello.go();
  }
}

但得到这样的例外

线程 “Thread-1” java.util.ConcurrentModificationException 中的异常

我的方法有什么问题吗?


答案 1

Iterator的 未(且无法)同步,您需要在迭代时手动同步列表(请参阅 javadoc):synchronizedList

synchronized(arrayList) {
    Iterator it=arrayList.iterator(); 
    while(it.hasNext()) { 
        System.out.println(it.next()); 
   } 
}

另一种方法是使用 CopyOnWriteArrayList 而不是 。它实现了写入时复制语义,因此不需要同步。Collections.synchronizedList()


答案 2

考虑使用线程安全的 CopyOnWriteArrayList。每次添加项时,都会创建基础数组的新副本。但是,自创建迭代器以来,迭代器不会反映对列表的添加,但保证不会引发 。ConcurrentModificationException

arrayList=new CopyOnWriteArrayList();