synchronizedList的非确定性行为

时间:2014-11-03 11:32:55

标签: java multithreading arraylist

我正在尝试理解Collections.synchronizedList()的概念,但下面的代码无法正常工作。根据我的理解,synchronizedList将同步ArrayList的所有方法并将其放入synchronised阻止其他线程访问/修改获取锁的对象。下面是我的代码。

 public class SynchronisedList {

    /**
     * @param args
     */

    static ArrayList<String> list=new ArrayList<String>();


    public static void main(String[] args) {
        // TODO Auto-generated method stub

        for(int i=0;i<50000;i++)
            list.add("String"+i);


        final List<String> list1=Collections.synchronizedList(list); 

        Thread thread=new Thread(new Runnable() {

            @Override
            public void run() {

                System.out.println("Thread 1 started");

                synchronized (list1) 
                {
                    for(int i=0;i<50000;i++)
                    {

                        System.out.println(list1.get(i));
                        //System.out.println(list.get(i));
                    }
                }
            }
        });

        Thread thread1=new Thread(new Runnable() {

            @Override
            public void run() {
                System.out.println("Thread 2 started");
                list1.clear();
        }
        });


        thread.start();

        thread1.start();

    }

}

我的预期输出是线程1将通过arraylist list1迭代,然后线程2将清除它。但是我收到错误,

Exception in thread "Thread-0" java.lang.IndexOutOfBoundsException: Index: 432, Size: 0
    at java.util.ArrayList.RangeCheck(ArrayList.java:547)
    at java.util.ArrayList.get(ArrayList.java:322)
    at java.util.Collections$SynchronizedList.get(Collections.java:1816)
    at com.common.List.SynchronisedList$1.run(SynchronisedList.java:35)
    at java.lang.Thread.run(Thread.java:619)

我在这里做错了吗?请帮忙。

1 个答案:

答案 0 :(得分:0)

为了达到预期的输出,迭代和清除都应该在synchronized块中,你应该在原始列表上同步,list1是多余的