最近在新公司写需求,然后产生了一个bug,显示查询权限没有,我很纳闷,开始以为确实是这个用户没有权限,一直在业务层面上纠结问题产生的原因。后来一步步debug,才发现,在前人的基础上写代码,很难受。发现了这个问题(特想把之前的程序员抓过来,然后打一顿!)

 

关于Concurrent Modification Exception的产生原因以及解决办法_指定位置

 

大家先看看我标注的方框,思考一下,这样写真的好吗?

 

 

 

 

 

 

 

 

我相信资深的程序员是不习惯这个样写法的,具体为什么呢?

关于Concurrent Modification Exception的产生原因以及解决办法_加锁_02

产生的原因大家也应该有点思路了,不会一脸懵逼了。

那么现在我们究其根本来看看:

关于remove():删除此列表中指定位置的元素(可选操作)。 将任何后续元素向左移位(减去一个元素来自他们的指数)。 返回从中删除的元素清单。

 

那么关键点就在这了,他删除了此列表中指定位置的元素。其后的后续元素将会向左移动,这样的话,那么就会出现下标溢出异常。从而产生并发修改异常。

关于Concurrent Modification Exception的产生原因以及解决办法_加锁_03

 

对于解决办法,我个人给出一种最为简单的理解的方法:

1.就是将“我们要删除的元素不管,用一个全新的List来接收你不需要删除的元素就行了”

2.第二种就是加锁了,

3.要么就是使用Map中的迭代器进行遍历

第二种第三种方法具体实现我就不给出了,要有求知欲,而不是现拿现用。。