码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-10-31 16:59:32      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:成员   cep   throw   remove   return   equal   pre   次数   ica   

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

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

标签:成员   cep   throw   remove   return   equal   pre   次数   ica   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!