我正在尝试理解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)
我在这里做错了吗?请帮忙。
答案 0 :(得分:0)
为了达到预期的输出,迭代和清除都应该在synchronized
块中,你应该在原始列表上同步,list1是多余的