import
java.util.ArrayList;
import
java.util.Iterator;
import
java.util.List;
import
java.util.concurrent.CopyOnWriteArrayList;
public
class
ConcurrentListExample {
public
static
void
main(String[] args) {
List<String> list =
new
ArrayList<>();
list.add(
"1"
);
list.add(
"2"
);
list.add(
"3"
);
list.add(
"4"
);
list.add(
"5"
);
// get the iterator
Iterator<String> it = list.iterator();
//manipulate list while iterating
while
(it.hasNext()){
System.out.println(
"list is:"
+list);
String str = it.next();
System.out.println(str);
if
(str.equals(
"2"
))list.remove(
"5"
);
if
(str.equals(
"3"
))list.add(
"3 found"
);
if
(str.equals(
"4"
)) list.set(
1
,
"4"
);
}
}
}
上面的代码 当判断为”2“时,他作了修改,修改后当再次调用Iterator 的next()
他会抛出ConcurrentModificationException。这是因为ArrayList是快速失败模式的。当iterator 被创建后,如果ArrayList被修改,就会抛出ConcurrentModificationException。
ArrayList 里面判断了
final
void
checkForComodification() {
if
(modCount != expectedModCount)
throw
new
ConcurrentModificationException();
}
modCount是ArrayList的变量,当我们调用add,remove等的时候他会增加
|
,expectedModCount是
iterator 初始化时创建的和modCount一样的值
这就可以解释为什么我们用set方法覆盖重复值没有报错的原因。
如果把上面的类改成CopyOnWriteArrayList就不会出现这个问题。因为
CopyOnWriteArrayList是线程安全的