通过列表迭代,同步和使用迭代器的ConcurrentModificationException

时间:2012-04-19 13:25:17

标签: java concurrency synchronization iterator

如何为此代码块获取ConcurrentModificationException?

synchronized (list) {
        for (Iterator<?> it = list.iterator(); it.hasNext(); ) {
            Object object = it.next();
            // do something to object without touching list
        }
}

编辑:对不起,这不够具体://对象做某事不触及列表

2 个答案:

答案 0 :(得分:7)

例如,通过让另一个线程修改列表。

仅仅因为您同步此代码块并不意味着阻止了对列表的所有访问。它只确保列表上同步的所有其他块不能并行执行。

如果列表由多个线程共享,则所有其使用必须在同一台监视器上同步。

答案 1 :(得分:2)

如果“做某事”直接或间接地添加或删除list中的内容(除非使用it.remove()或类似内容),那么您将获得此异常。在这种情况下,同步不会阻止它发生。