ArrayList的线程安全测试

最近做的项目中要用多线程的方式取到数据后写入到List中,测试了下ArrayList的并发写,代码如下:

  1. public class TestThread implements Runnable{
  2.     private List list;
  3.     CountDownLatch cdl;
  4.     public TestThread(List list,CountDownLatch cdl){
  5.         this.list=list;
  6.         this.cdl=cdl;
  7.     }
  8.     /**
  9.      * @see java.lang.Runnable#run()
  10.      */
  11.     @Override
  12.     public void run() {
  13.         for(int i=0;i<500;i++){
  14.             list.add(“a”);
  15.         }
  16.         try {
  17.             cdl.countDown();
  18.         } catch (Exception e) {
  19.             e.printStackTrace();
  20.         }
  21.     }
  22.     public static void main(String[] args) throws Exception{
  23.         int count=32;
  24.         CountDownLatch cdl=new CountDownLatch(count);
  25.         List list=new ArrayList();
  26.         //List list=Collections.synchronizedList(new ArrayList());
  27.         TestThread t1=new TestThread(list,cdl);
  28.         for(int i=0;i<count;i++){
  29.             new Thread(t1).start();
  30.         }
  31.         cdl.await();
  32.         System.out.println(“size:”+list.size());
  33.     }
  34. }

 

结论是,用ArrayList时,出现如下错误:

  1. Exception in thread “Thread-1” java.lang.ArrayIndexOutOfBoundsException: 452
  2.     at java.util.ArrayList.add(ArrayList.java:352)

改为List list=Collections.synchronizedList(new ArrayList())之后,就正常了。

标签