Spring boot Spring Boot CRUD存储库中的ConcurrentModificationException
这是一个理论问题。我想了解在Spring Boot中使用CRUD存储库时出现Spring boot Spring Boot CRUD存储库中的ConcurrentModificationException,spring-boot,Spring Boot,这是一个理论问题。我想了解在Spring Boot中使用CRUD存储库时出现ConcurrentModificationException异常的可能原因 更确切地说,我有一个具体的问题,我想得到一个“是”或“否”的答案。知道异常有时是由行myRepository.saveAll(myArrayList)引发的,并且在不同的线程中使用myRepository,通过这个saveAll和一个findById,在saveAll和findById的不同线程中并行执行是否可能产生这样的异常?我希望答案是“不
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);
}
从的文档中,您可以更详细地了解它
请注意,此异常并不总是表示对象具有
被另一个线程同时修改。如果是单线程
发出一系列违反
对象时,该对象可能会引发此异常。例如,如果
线程在集合上迭代时直接修改集合
集合,迭代器将抛出
例外
即使Springcrudepository
可能是一个问题(据我所知,它们是threadsafe
),在不同步的情况下使用不同线程的ArrayList
实例也是不安全的