【问题标题】:for-each loop not throwing ConcurrentModificationException [duplicate]for-each 循环不抛出 ConcurrentModificationException [重复]
【发布时间】:2017-06-28 17:52:09
【问题描述】:

我有一个方法可以遍历一个列表并删除一个对象。

public void iterateAndRemove(List<String> l) {
    for (String s : l) {
        l.remove(s); //should throw exception
    }
}

理想情况下,这应该会引发异常,因为我没有使用 Iterator

但它工作正常。是不是我的理解错了?

【问题讨论】:

    标签: java


    【解决方案1】:

    众所周知的概念是,通过Iterator 删除是一种故障安全机制。

    for-each 循环可用于从列表中删除项目,因为 javac 内部生成使用迭代器的代码,重复调用 hasNextnext 方法。

    另外,即使 for-each 是抛出并发修改异常,程序也不一定总是抛出异常,所以你不能依赖几次测试运行。

    但您必须注意,这适用于单线程环境。对于多线程环境,您必须锁定对象才能让程序不抛出异常。

    【讨论】:

      猜你喜欢
      • 2015-11-10
      • 1970-01-01
      • 2015-10-02
      • 2013-02-12
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-24
      相关资源
      最近更新 更多