当满足竞争条件时,将发生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);
}