Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ความแตกต่างระหว่าง fail-fast และ fail safe ใน Java


ซีเนียร์ เลขที่ คีย์ ล้มเหลว-เร็ว Fail-Safe
1
ข้อยกเว้น
การเปลี่ยนแปลงใดๆ ในคอลเล็กชัน เช่น การเพิ่ม การลบ และการอัปเดตคอลเล็กชันระหว่างเธรดเป็นการวนซ้ำคอลเล็กชัน จากนั้น Fail fast throw ข้อยกเว้นการแก้ไขพร้อมกัน
คอลเลกชันที่ป้องกันความผิดพลาดนั้นไม่มีข้อยกเว้น
2.
ประเภทของคอลเลกชัน
ArrayList และคอลเล็กชัน hashmap เป็นตัวอย่างของตัววนซ้ำที่ล้มเหลวอย่างรวดเร็ว
CopyOnWrite และการแก้ไขพร้อมกันเป็นตัวอย่างของตัววนซ้ำที่ไม่ปลอดภัย
3.
ประสิทธิภาพและหน่วยความจำ
ใช้งานได้กับคอลเล็กชันจริงแทน ดังนั้นตัววนซ้ำนี้จึงไม่ต้องการหน่วยความจำและเวลาเพิ่มเติม
กำลังทำงานกับโคลนของคอลเลคชันแทนที่จะเป็นคอลเล็กชันจริง มันเป็นค่าใช้จ่ายในแง่ของเวลาและหน่วยความจำ
4.
การปรับเปลี่ยน
ตัววนซ้ำไม่อนุญาตให้แก้ไขคอลเล็กชันขณะวนซ้ำ
ตัววนซ้ำแบบ Fail-Safe อนุญาตให้แก้ไขคอลเล็กชันขณะทำซ้ำได้

ตัวอย่างของ FailSafe

public class FailSafeExample{
   public static void main(String[] args){
      ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<String, Integer>();
      //Adding elements to map
      map.put("Dell", 1);
      map.put("IBM", 2);
      //Getting an Iterator from map
      Iterator<String> it = map.keySet().iterator();
      while (it.hasNext()){
      String key = (String) it.next();
         System.out.println(key+" : "+map.get(key));
         map.put("Google", 3);
      }
   }
}

ผลลัพธ์

IBM :2
Dell:1

ตัวอย่างของ FailSafe

public class FailFastExample{
   public static void main(String[] args){
      List<Integer> list = new ArrayList<Integer>();
      list.add(1);
      list.add(2);
      list.add(3);
      //Getting an Iterator from list
      Iterator<Integer> it = list.iterator();
      while (it.hasNext()){
         Integer integer = (Integer) it.next();
         list.add(4);
      }
   }
}

ผลลัพธ์

Exception in thread "main" java.util.ConcurrentModificationException
   at java.util.ArrayList$Itr.checkForComodification(Unknown Source)