我有下面这段引起了ConcurrentModificationException的代码。我没有对products
对象进行修改,
List<Product> products = Product.findActiveByFilter(filters);
Set<Long> temp = new HashSet<Long>();
List<Product> resultSetTemp = new ArrayList<Product>();
for (Product product : products) { // << Exception points to this
if(!temp.contains(product.getId())){
temp.add(product.getId());
resultSetTemp.add(product);
}
}
products.clear();
products.addAll(resultSetTemp);
我已经多次见到这个异常弹出,但我无法复现它(它是随机发生的)。
Product.findActiveByFilter
是一个方法,它返回一个新的 List<Product>
实例,该实例是从缓存的 List<Product>
构建的。
编辑:我找到了一种复现错误的方法。当客户端想要产品(它是一个网店)时,代码被调用,并且当客户端向下滚动页面以加载更多项目时,会触发异常(因为服务器尚未完成响应产品并收到另一个调用)。竞争条件,有趣!
Product.findActiveByFilter
的代码? - BadIdeaExceptionMap<Long, Product>
来存储你的结果,而不是保持两个集合同步? - Boris the Spider