java CopyOnWriteArrayList/ConcurrentHashMap如何在内部处理并发修改异常?
我想从内部了解在像ConcurrentHashMap
和CopyOnWriteArrayList
这样的并发集合中如何处理并发修改异常
互联网上有很多博客,建议使用这两种数据结构来避免并发修改异常。但并没有解释并发集合如何在内部处理此异常
有人能对此给出更多的见解吗?我需要一些详细的解释
你可以在下面搜索框中键入要查询的问题!
我想从内部了解在像ConcurrentHashMap
和CopyOnWriteArrayList
这样的并发集合中如何处理并发修改异常
互联网上有很多博客,建议使用这两种数据结构来避免并发修改异常。但并没有解释并发集合如何在内部处理此异常
有人能对此给出更多的见解吗?我需要一些详细的解释
# 1 楼答案
现在,这将回答CopyOnWriteArrayList如何避免ConcurrentModificationException的需要
修改集合时,CopyOnWriteArrayList会执行两项操作
那么,这是如何预防CME的呢?标准集合中的CME将仅作为迭代的结果抛出。如果在对集合进行迭代时,在同一集合实例上执行添加或删除操作,则会引发异常
CopyOnWriteArrayList的迭代器将当前数组指定为集合的最终字段快照,并将其用于迭代。如果另一个线程(甚至是同一个线程)尝试添加到CopyOnWriteArrayList,则更新将应用于新副本,而不是我们当前迭代的快照
例如,我们知道add方法如下所示
请注意正在进行的线程本地新元素分配,完成后将设置为类实例
volatile
数组然后是迭代器,它被定义为
因此,在迭代时,我们正在读取任何修改之前的数组,因为没有其他线程可以修改快照,所以我们正在查看ConcurrentModificationException不会发生
# 2 楼答案
你问题的字面答案不是很有趣
ConcurrentHashMap
和CopyOnWriteArrayList
不抛出ConcurrentModificationException
,因为它们不包含抛出它的代码它不像}被抛出
ConcurrentModificationException
是某种低级的内在事物ArrayList
和HashMap
以及其他集合类,抛出ConcurrentModificationException
以帮助您。它们必须包含额外代码,以尝试检测并发修改,并包含引发异常的额外代码^当其中一个类检测到某个地方存在导致对集合进行不安全修改的bug时,{支持安全并发修改的类不会抛出
ConcurrentModificationException
,因为它们不需要抛出如果您正在尝试调试
ConcurrentModificationException
,那么还有很多其他问题可以帮助您回答:# 3 楼答案
下面是
ArrayList
和CopyOnWriteArrayList
的add()
方法定义阵列列表:
CopyOnWriteArrayList:
从上面的代码中可以清楚地看出}代码,可以看到它在修改集合之前已锁定。另外,ArrayList的迭代器方法(如
CopyOnWriteArrayList
在修改映射之前会锁定。这里我刚刚发布了add
方法的代码。如果查看remove()
/addAll()
或任何method which modifies
的List
{next()/remove()
)检查修改,但CopyOnWriteArrayList的迭代器方法不检查修改。例如:ArrayList迭代器next()方法:
CopyOnWriteArrayList迭代器next()方法: