[英]ConcurrentModificationException while iterating through List, altough not modifying it
[英]ConcurrentModificationException while iterating through a list but not modifying it
我正在使用JMeter运行我的应用程序以进行负载测试,并在(我认为)它不应该出现的情况下获得ConcurrentModificationException
。 这种情况仅发生在少数情况下,并非全部发生。
我有一个ArrayList
,它是一个类变量,通过方法在其中添加元素。 稍后,在准备列表之后调用另一种方法,使用stream
继续进行迭代,并使用一些过滤器准备本地数组列表,如下所示
...
//class variable getting elements from a separate method
List<String> myGlobalList = new ArrayList();
...
public String returnValue(String _value){
List myLocalList = new ArrayList();
myGlobalList.stream().filter(ele -> {
ele = ele.replaceAll("\\[(.*?)\\]", "$1");
String[] strArr = ele.split(",");
for(String sArr : strArr) {
if(sArr.contains(_value)){
System.out.println("sArr ---- > "+sArr);
myLocalList.add(sArr);
return true ;
}
}
return false;
}).findFirst();
return myLocalList.size()>0 ? myLocalList.get(0): null;
}
findFirst()
方法仅在负载下抛出ConcurrentModificationException
(并非针对每个请求)。
无法弄清楚为什么会这样。 我缺少任何钥匙吗? 在所有情况下如何修改此代码以避免此异常?
更新:
下面是来自堆栈跟踪的摘录
java.util.ConcurrentModificationException
at java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1353)
at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464)
at com.pkg.MyClass.returnValue(MyClass.java:501)
您是否不需要获取列表中的第一个字符串? 为什么不使用List就不获取它:
public String returnValue(String _value){
String findFirst = myGlobalList.stream().filter(ele -> {
ele = ele.replaceAll("\\[(.*?)\\]", "$1");
String[] strArr = ele.split(",");
for(String sArr : strArr) {
if(sArr.contains(_value)){
System.out.println("sArr ---- > "+sArr);
//myLocalList.add(sArr);
return true ;
}
}
return false;
}).findFirst().get();
return findFirst;
}
编辑
带有可选检查:
Optional<String> findFirst = myGlobalList.stream().filter(ele -> {
ele = ele.replaceAll("\\[(.*?)\\]", "$1");
String[] strArr = ele.split(",");
for (String sArr : strArr) {
if (sArr.contains(_value)) {
System.out.println("sArr ---- > " + sArr);
// myLocalList.add(sArr);
return true;
}
}
return false;
}).findFirst();
return findFirst.isPresent() ? findFirst.get() : null;
编辑2
findFirst
异常,因为原始列表已更改,请尝试使用collect将结果收集到新列表中,然后获取第一个值:
return myGlobalList.stream().filter(ele -> {
ele = ele.replaceAll("\\[(.*?)\\]", "$1");
String[] strArr = ele.split(",");
for (String sArr : strArr) {
if (sArr.contains(_value)) {
//System.out.println("sArr ---- > " + sArr);
// myLocalList.add(sArr);
return true;
}
}
return false;
}).collect(Collectors.toList()).get(0);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.