1 public static void main(String[] args)
2 {
3 List list = new CopyOnWriteArrayList();
4 list.add(1);
5 list.add(2);
6 }
看一下这段代码做了什么,先是第3行的实例化一个新的CopyOnWriteArrayList:
public class CopyOnWriteArrayList
implements List, RandomAccess, Cloneable, java.io.Serializable {
private static final long serialVersionUID = 8673264195747942595L;
/** The lock protecting all mutators */
transient final ReentrantLock lock = new ReentrantLock();
/** The array, accessed only via getArray/setArray. */
private volatile transient Object[] array;
...
}
public CopyOnWriteArrayList() {
setArray(new Object[0]);
}
public static class T1 extends Thread
{
private List list;
public T1(List list)
{
this.list = list;
}
public void run()
{
for (Integer i : list)
{
}
}
}
public static class T2 extends Thread
{
private List list;
public T2(List list)
{
this.list = list;
}
public void run()
{
for (int i = 0; i < list.size(); i++)
{
list.remove(i);
}
}
}
首先我在这两个线程中放入ArrayList并启动这两个线程:
public static void main(String[] args)
{
List list = new ArrayList();
for (int i = 0; i < 10000; i++)
{
list.add(i);
}
T1 t1 = new T1(list);
T2 t2 = new T2(list);
t1.start();
t2.start();
}
运行结果为:
Exception in thread "Thread-0" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at com.xrq.test60.TestMain$T1.run(TestMain.java:19)
把ArrayList换成LinkedList,main函数的代码就不贴了,运行结果为:
Exception in thread "Thread-0" java.util.ConcurrentModificationException
at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:761)
at java.util.LinkedList$ListItr.next(LinkedList.java:696)
at com.xrq.test60.TestMain$T1.run(TestMain.java:19)
Exception in thread "Thread-0" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at com.xrq.test60.TestMain$T1.run(TestMain.java:19)
public static void main(String[] args)
{
List list = new CopyOnWriteArrayList();
for (int i = 0; i < 10; i++)
{
list.add(i);
}
T1 t1 = new T1(list);
T2 t2 = new T2(list);
t1.start();
t2.start();
}