java中的fail-fast(快速失敗)機制__java
來源:互聯網
上載者:User
引入 在前面介紹 ArrayList的擴容問題時對於modCount的操作沒有詳細說明,該變數的操作在add,remove等操作中都會發生改變。那麼該變數到底有什麼作用呢。 簡介 fail-fast 機制,即快速失敗機制,是java集合(Collection)中的一種錯誤偵測機制。當在迭代集合的過程中該集合在結構上發生改變的時候,就有可能會發生fail-fast,即拋出 ConcurrentModificationException異常。fail-fast機制並不保證在不同步的修改下一定會拋出異常,它只是盡最大努力去拋出,所以這種機制一般僅用於檢測bug。 fail-fast的出現情境 在我們常見的java集合中就可能出現fail-fast機制,比如ArrayList,HashMap。在多線程和單線程環境下都有可能出現快速失敗。 1、單線程環境下的fail-fast: ArrayList發生fail-fast例子:
[java] view plain copy public static void main(String[] args) { List<String> list = new ArrayList<>(); for (int i = 0 ; i < 10 ; i++ ) { list.add(i + ""); } Iterator<String> iterator = list.iterator(); int i = 0 ; while(iterator.hasNext()) { if (i == 3) { list.remove(3); } System.out.println(iterator.next()); i ++; } } 該段代碼定義了一個Arraylist集合,並使用迭代器遍曆,在遍曆過程中,刻意在某一步迭代中remove一個元素,這個時候,就會發生fail-fast。
HashMap發生fail-fast:
[java] view plain copy public static void main(String[] args) { Map<String, String> map = new HashMap<>(); for (int i = 0 ; i < 10 ; i ++ ) { map.put(i+"", i+""); } Iterator<Entry<String, String>> it = map.entrySet().iterator(); int i = 0; while (it.hasNext()) { if (i == 3) { map.remove(3+""); } Entry<String, String> entry = it.next(); System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue()); i++; } } 該段代碼定義了一個hashmap對象並存放了10個索引值對,在迭代遍曆過程中,使用map的remove方法移除了一個元素,導致拋出了 ConcurrentModificationException異常:
2、多線程環境下:
[java] view plain copy public class FailFastTest { public static List<String> list = new ArrayList<>();