Fail Fast
Fail Fast Iterator在遍歷集合時,若該集合發生了結構性的改變,則將拋出 ConcurrentModification 異常。例如:
Map<String, String> premiumPhone = new HashMap<String, String>();
premiumPhone.put("Apple", "iPhone");
premiumPhone.put("HTC", "HTC one");
premiumPhone.put("Samsung", "S5");
Iterator<String> iterator = premiumPhone.keySet().iterator();
while (iterator.hasNext()) {
System.out.println(premiumPhone.get(iterator.next()));
premiumPhone.put("Sony", "Xperia Z");
}
如果將while循環內的語句
premiumPhone.put("Sony", "Xperia Z");
改成如下,則不會拋出ConcurrentModification 異常。因爲只修改了值,沒有改變集合的結構
premiumPhone.put("HTC", "Xperia Z");
Fail Fast檢測集合結構改變的原理,Iterator直接訪問集合的數據結構,它保留一個標誌”mods”,在Iterator每次調用hasNext()或者是next()方法時,首先檢測”mods”狀態,如果結構已經改變,則拋出異常。
Fail Safe
Fail Safe Iterator的實現原理是,先將原集合拷貝一份,在拷貝上開展遍歷,因此不會引起ConcurrentModification 異常。因此,Fail Safe Iterator存在兩個缺陷:
1. 引入了額外的空間開銷
2. 遍歷時讀取的數據,並不能保證是最新的
一個Fail Safe Iterator的例子如下:
ConcurrentHashMap<String, String> premiumPhone = new ConcurrentHashMap<String, String>();
premiumPhone.put("Apple", "iPhone");
premiumPhone.put("HTC", "HTC one");
premiumPhone.put("Samsung", "S5");
Iterator<String> iterator = premiumPhone.keySet().iterator();
while (iterator.hasNext()) {
System.out.println(premiumPhone.get(iterator.next()));
premiumPhone.put("Sony", "Xperia Z");
}