黑马程序员技术交流社区

标题: Set体系在用迭代器迭代时为什么没有并发修改异常 [打印本页]

作者: wlsperfect    时间: 2016-3-20 15:34
标题: Set体系在用迭代器迭代时为什么没有并发修改异常
public static void main(String[] args) {
                Set<String> s = new HashSet<>();
                s.add("aaa");
                s.add("world");
                s.add("bbb");
                Iterator<String> it = s.iterator();
                while(it.hasNext()) {      //在迭代遍历的同时增加元素
                        if("world".equals(it.next())) {
                                s.add("javaee");
                        }
                }
                System.out.println(s);
        }
上面程序是Set体系使用迭代器遍历元素,并在遍历过程中用s.add()方法增加元素,但是并没有像在List体系中那样,出现并发修改异常,请问大神解释一下!!!


作者: zshhappy    时间: 2016-3-20 15:59
此类的 iterator 方法返回的迭代器是快速失败 的:在创建迭代器之后,如果对 set 进行修改,除非通过迭代器自身的 remove 方法,否则在任何时间以任何方式对其进行修改,Iterator 都将抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不冒将来在某个不确定时间发生任意不确定行为的风险。

注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器在尽最大努力抛出 ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误做法:迭代器的快速失败行为应该仅用于检测。

作者: 超人d咖啡也加糖    时间: 2016-3-20 16:05
我的报异常了,是你的编译问题吧





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2