publicstaticvoidmain(String[] args){
final List<String> list = Collections
.synchronizedList(new ArrayList<String>());
startIteratorThread(list);
startModifyThread(list);
}
复制代码
将list替换为CopyOnWriteArrayList,就不会有异常,如:编程
publicstaticvoidmain(String[] args){
final List<String> list = new CopyOnWriteArrayList<>();
startIteratorThread(list);
startModifyThread(list);
}
复制代码
publicstaticvoidsort(){
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("c");
list.add("a");
list.add("b");
Collections.sort(list);
}
复制代码
执行这段代码会抛出异常:数组
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.concurrent.CopyOnWriteArrayList$COWIterator.set(CopyOnWriteArrayList.java:1049)
at java.util.Collections.sort(Collections.java:159)
复制代码
为何呢?由于Collections.sort方法依赖迭代器的set方法,其代码为:安全
publicstatic <T extends Comparable<? super T>> voidsort(List<T> list){
Object[] a = list.toArray();
Arrays.sort(a);
ListIterator<T> i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set((T)a[j]);
}
}
复制代码
privatestaticintindexOf(Object o, Object[] elements, int index, int fence){
if (o == null) {
for (int i = index; i < fence; i++)
if (elements[i] == null)
return i;
} else {
for (int i = index; i < fence; i++)
if (o.equals(elements[i]))
return i;
}
return -1;
}
复制代码
这个indexOf方法访问的全部数据都是经过参数传递进来的,数组内容也不会被修改,不存在并发问题。
迭代器方法为:
public Iterator<E> iterator(){
returnnew COWIterator<E>(getArray(), 0);
}
复制代码