首页 > 其他 > 详细

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

时间:2018-10-31 16:40:45      阅读:166      评论:0      收藏:0      [点我收藏+]
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();
    }

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

原文:http://blog.51cto.com/3265857/2311157

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!