modCount:記錄當前集合被修改的次數
在所有的集合實現類中(Collection與Map中),都會有一個 modCount 的變量出現,它的作用就是記錄當前集合被修改的次數。
下面以ArrayList 類進行說明:
添加方法:
刪除方法:
可以看出,兩個操作都會影響元素的個數。
當我們使用迭代器或 foreach 遍歷時,如果你在 foreach 遍歷時,自動調用迭代器的迭代方法,此時在遍歷過程中調用了集合的add,remove方法時,modCount就會改變,而迭代器記錄的modCount是開始迭代之前的,如果兩個不一致,就會報異常,說明有兩個線路(線程)同時操作集合。這種操作有風險,為了保證結果的正確性, 避免這樣的情況發生,一旦發現modCount與expectedModCount不一致,立即報錯。
此類的 iterator 和 listIterator 方法返回的迭代器是快速失敗的:在創建迭代器之后,除非通過迭代器自身的 remove 或 add 方法從結構上對列表進行修改, 否則在任何時間以任何方式對列表進行修改, 迭代器都會拋出 ConcurrentModificationException。 因此,面對並發的修改,迭代器很快就會完全失敗, 而不是冒着在將來某個不確定時間發生任意不確定行為的風險。