同步类容器并发修改的问题

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();
    }

以上是关于同步类容器并发修改的问题的主要内容,如果未能解决你的问题,请参考以下文章

架构师养成--7.同步类容器和并发类容器

并发编程:同步类容器与并发类容器

Java线程同步类容器和并发容器

[Java 并发编程实战] 同步容器类潜在的问题(含实例代码)

[Java 并发编程实战] 同步容器类潜在的问题(含实例代码)

JAVA并发同步容器和并发容器