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