多線程-併發容器-集合操作-fail-fast機制

java中的fail-fast機制是集合的一種錯誤檢測機制,當某個線程在對collection進行迭代時,不允許其他線程對該collection進行結構上的更改。

示例:

fast-fail事件:當多個線程對collection進行操作時,若當某一個線程通過iterator去遍歷該集合時,該集合的內容被其他線程所改變,則會拋出ConcurrentModificationException異常。

究其本源,產生fail-fast事件,是通過拋出ConcurrentModificationException異常來觸發的。則ArrayList是如何拋出ConcurrentModificationException異常的呢?
從源碼中可知ConcurrentModificationException是在操作Iterator時拋出的異常,我們先看看Iterator的源碼。ArrayList的Iterator是在父類AbstractList.java中實現的,其中modCount記錄List修改的次數,每修改一次(添加/刪除等操作),每遍歷List中的元素的時候,都會比較expectedModCount和modCount是否相等,若不相等,則拋出ConcurrentModificationException異常,產生fail-fast事件。

(注:可通過Util.concurrent集合包下的相應類處理<新建COWIterator時,將集合中的元素保存到一個新的拷貝數組中,當原始集合的數據改變,拷貝數據中的值也不會變化,即沒有checkForComodification()>,則不會產生fast-fail事件.)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章