同步类容器并发修改的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同步类容器并发修改的问题相关的知识,希望对你有一定的参考价值。
1、同步类容器都是线程安全的,在某些场景下需要加锁来保护复合操作。
2、常见的复合操作有:迭代(反复访问元素,遍历容器中所有元素)、跳转(根据指定的顺序找到当前元素的下一个元素)、以及条件运算等。
3、在这些复合操作下,进行并发的修改(add或remove)容器时,会抛出java.util.ConcurrentModificationException异常。在早期的迭代器设计的时候并没有考虑并发修改的问题。
...
Vector v = new Vector<>();
v.add("1");
v.add("2");
v.add("3");
...
public Collection<String> m2(Vector<String> list) {
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String temp = iterator.next();
if ("3".equals(temp)) {
list.remove(temp);
}
}
return list;
}
4、阅读源码可以看到,在AbstractList类里面定义有成员变量modCount(修改次数)和expectedModCount(期望修改次数,初始值为modCount),在多线程并发下修改时候会出现这两个值不相等,而抛出ConcurrentModificationException异常。
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
以上是关于同步类容器并发修改的问题的主要内容,如果未能解决你的问题,请参考以下文章
[Java 并发编程实战] 同步容器类潜在的问题(含实例代码)