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);
}
複製代碼