Spring boot Spring Boot CRUD存储库中的ConcurrentModificationException

Spring boot Spring Boot CRUD存储库中的ConcurrentModificationException,spring-boot,Spring Boot,这是一个理论问题。我想了解在Spring Boot中使用CRUD存储库时出现ConcurrentModificationException异常的可能原因 更确切地说,我有一个具体的问题,我想得到一个“是”或“否”的答案。知道异常有时是由行myRepository.saveAll(myArrayList)引发的,并且在不同的线程中使用myRepository,通过这个saveAll和一个findById,在saveAll和findById的不同线程中并行执行是否可能产生这样的异常?我希望答案是“不

这是一个理论问题。我想了解在Spring Boot中使用CRUD存储库时出现
ConcurrentModificationException
异常的可能原因

更确切地说,我有一个具体的问题,我想得到一个“是”或“否”的答案。知道异常有时是由行
myRepository.saveAll(myArrayList)引发的,并且在不同的线程中使用
myRepository
,通过这个
saveAll
和一个
findById
,在
saveAll
findById
的不同线程中并行执行是否可能产生这样的异常?我希望答案是“不”,但我不确定。如果答案是“是”,我就不清楚如何解决这个问题

如果答案是“否”,是否意味着有时会引发此异常的唯一情况是在不同线程中同时使用
myArrayList
(我的代码就是这样做的),即一个线程在另一个线程中执行
saveAll
时对
myArrayList
进行修改(添加元素)?如果是这样,将
saveAll
myArrayList.add(…)
代码包含在
synchronized(myArrayList){}
中是否足够

为完整起见,
myRepository
是一个简单扩展
crudepository
的接口,用
@Repository
@Transactional
进行注释


感谢您的澄清。

在saveAll和findById的不同线程中并行执行是否可能会生成这样的异常

List<Integer> integers = new ArrayList(1, 2, 3);
    for (Integer integer : integers) {
        integers.remove(1);
    }
否-这些方法是

这是否意味着只有在某些情况下 此例外情况是在不同的应用程序中同时使用myArrayList 线程(我的代码就是这样),即修改(添加元素) 在中执行saveAll时,由一个线程执行myArrayList 另一条线

从您的问题陈述中,上述处理是导致异常的最可能原因。话虽如此,一般来说,即使是单线程也可能导致收集。如果在迭代集合时对其进行修改,则抛出此异常是实现集合所采用的快速失败机制。例如,下面的代码如果在单个线程中运行,仍然会引发此异常

List<Integer> integers = new ArrayList(1, 2, 3);
    for (Integer integer : integers) {
        integers.remove(1);
    }
List integers=newarraylist(1,2,3);
for(整数:整数){
整数。删除(1);
}
从的文档中,您可以更详细地了解它

请注意,此异常并不总是表示对象具有 被另一个线程同时修改。如果是单线程 发出一系列违反 对象时,该对象可能会引发此异常。例如,如果 线程在集合上迭代时直接修改集合 集合,迭代器将抛出 例外


即使Spring
crudepository
可能是一个问题(据我所知,它们是
threadsafe
),在不同步的情况下使用不同线程的
ArrayList
实例也是不安全的