我什么时候得到ConcurrentModificationException?

时间:2017-03-29 04:33:08

标签: java list collections race-condition

当满足竞争条件时,将发生AFAIK并发修改异常。举个例子,当我们试图同时修改共享资源时,会出现竞争条件。这同样发生在这里

public static void removeValuesFromListWhichIsNotPresentInJson() throws Exception {
    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("h");
    list.add("f");
    list.add("s");
    JSONObject json = new JSONObject();
    json.put("abc", "def");
    json.put("ghi", "jkl");
    json.put("a", "b");
    json.put("h", "f");
    for(String value : list) {
        if(json.has(value)) {
            list.remove(value);
        }
    }
    System.out.println("The final value of list is : "+list);
}

for循环中的迭代器正在从列表中读取数据,我试图从if中的列表中删除一个元素(这就像写入一样)。因此,当读取和写入在共享资源(list)上同时发生时会导致不一致。所以它产生ConcurrentModificationException这是非常正确的。

同样的事情发生在下面的代码片段上,但是没有任何例外,它可以正常工作吗?

    public static void removeValuesFromListWhichIsPresentInJson() throws Exception {
    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("h");
    list.add("f");
    list.add("s");
    JSONObject json = new JSONObject();
    json.put("abc", "def");
    json.put("ghi", "jkl");
    json.put("a", "b");
    json.put("h", "f");
    for(String value : list) {
        if(!json.has(value)) {
            list.remove(value);
        }
    }
    System.out.println("The final value of list is : "+list);
}

0 个答案:

没有答案