ArrayList的线程安全测试

2014-11-24 10:21:36 · 作者: · 浏览: 0

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

public class TestThread implements Runnable{ 
 
    private List list; 
    CountDownLatch cdl; 
     
     
    public TestThread(List list,CountDownLatch cdl){ 
        this.list=list; 
        this.cdl=cdl; 
    } 
    /**
     * @see java.lang.Runnable#run()
     */ 
    @Override 
    public void run() { 
        for(int i=0;i<500;i++){ 
            list.add("a"); 
        }    
        try { 
            cdl.countDown(); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 
     
    public static void main(String[] args) throws Exception{ 
        int count=32; 
        CountDownLatch cdl=new CountDownLatch(count); 
        List list=new ArrayList(); 
        //List list=Collections.synchronizedList(new ArrayList());  
        TestThread t1=new TestThread(list,cdl); 
        for(int i=0;i 
 

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


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

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


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