java.util.concurrent包下的并发集合
java.util.concurrent.ConcurrentHashMap
java.util.concurrent.ConcurrentSkipListMap
java.util.concurrent.CopyOnWriteArrayList
java.util.concurrent.CopyOnWriteArraySet
java.util.concurrent.ConcurrentSkipListSet
先演示一下不使用并发集合的问题
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionModifyExceptionTest {
public static void main(String[] args) {
Collection<String> strs = new ArrayList<String>();
strs.add("LiuPeiFeng");
strs.add("WenTing");
strs.add("SongShenYangPian");
Iterator<String> itrUsers = strs.iterator();
String strFlag = "LiuPeiFeng";
while (itrUsers.hasNext()) {
System.out.println("aaaa");
String str = itrUsers.next();
if (strFlag.equals(str)) {
strs.remove(str); // 此处如果调用的是Iterator对象的remove()方法就不会报错了
} else {
System.out.println(str);
}
}
}
}
strFlag = “SongShenYangPian”的运行结果:
strFlag = “WenTing”的运行结果:
strFlag = “LiuPeiFeng”的运行结果:
对运行结果的解释:
通过查看源码可以发现有这样一行代码
在查看Javadoc对他的解释
大概意思是说:这个字段是用来计算集合被修改的次数的,当调用iterator()方法时会执行expectedModCount = modCount;
当修改集合(add、remove方法)时执行modCount++;,此时expectedModCount != modCount;,当调用next()方法时会调用checkForComodification();方法
此时就会抛出异常了。
在以上代码中如果调用Iterator对象的remove()方法就不会报错。
Iterator对象的remove()方法的实现如下:
所以换用并发集合,不会发生这样的问题
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;
public class CollectionModifyExceptionTest {
public static void main(String[] args) {
//Collection<String> strs = new ArrayList<String>();
Collection<String> strs = new CopyOnWriteArrayList<String>();
strs.add("LiuPeiFeng");
strs.add("WenTing");
strs.add("SongShenYangPian");
Iterator<String> itrUsers = strs.iterator();
String strFlag = "LiuPeiFeng";
while (itrUsers.hasNext()) {
System.out.println("aaaa");
String str = itrUsers.next();
if (strFlag.equals(str)) {
strs.remove(str); // 此处如果调用的是Iterator对象的remove()方法就不会报错了
} else {
System.out.println(str);
}
}
}
}
strFlag = “LiuPeiFeng”;时运行结果如下: