是java集合的一種錯誤檢測機(jī)制,當(dāng)多個線程對集合進(jìn)行結(jié)構(gòu)上的改變的操作時,有可能會產(chǎn)生 fail-fast 機(jī)制。
例如:假設(shè)存在兩個線程(線程1、線程2),線程1通過Iterator在遍歷集合A中的元素,在某個時候線程2修改了集合A的結(jié)構(gòu)(是結(jié)構(gòu)上面的修改,而不是簡單的修改集合元素的內(nèi)容),那么這個時候程序就會拋出 ConcurrentModificationException 異常,從而產(chǎn)生fail-fast機(jī)制。
原因:迭代器在遍歷時直接訪問集合中的內(nèi)容,并且在遍歷過程中使用一個 modCount 變量。集合在被遍歷期間如果內(nèi)容發(fā)生變化,就會改變modCount的值。每當(dāng)?shù)魇褂胔ashNext()/next()遍歷下一個元素之前,都會檢測modCount變量是否為expectedmodCount值,是的話就返回遍歷;否則拋出異常,終止遍歷。
解決辦法:
1. 在遍歷過程中,所有涉及到改變modCount值得地方全部加上synchronized。
2. 使用CopyOnWriteArrayList來替換ArrayList