ตัวทำซ้ำที่ปลอดภัยอย่างรวดเร็วและล้มเหลวใน Java: ความแตกต่างคืออะไร?



บทความเกี่ยวกับ 'Fail Fast and Fail Safe Iterators' จะช่วยให้คุณเปรียบเทียบ Iterator สองตัวนี้โดยละเอียดพร้อมตัวอย่างที่เกี่ยวข้อง

สนับสนุนตัวทำซ้ำสองประเภทประเภทแรกล้มเหลวอย่างรวดเร็วและแบบที่สองล้มเหลวอย่างปลอดภัย สิ่งเหล่านี้มีบทบาทสำคัญเมื่อพูดถึงการจัดการข้อยกเว้นใน Java ในบทความเรื่อง 'Fail Fast And Fail Safe Iterators' เราจะวิเคราะห์การทำงานของตัวทำซ้ำสองตัวรวมถึงความแตกต่างที่สำคัญระหว่างพวกเขา

ต่อไปนี้เป็นคำแนะนำที่จะกล่าวถึงในบทความนี้:





ก่อนที่จะอธิบายโดยละเอียดให้ทำความคุ้นเคยกับแนวคิดของการปรับเปลี่ยนพร้อมกัน

การปรับเปลี่ยนพร้อมกัน

เมื่อเธรดเดียว (หรือหลายเธรด) วนซ้ำบนคอลเลกชันก็สามารถเปลี่ยนโครงสร้างของคอลเลกชันได้โดยการเพิ่มหรือลบองค์ประกอบในคอลเลกชันหรือโดยการอัปเดตค่าขององค์ประกอบที่ตำแหน่งใดตำแหน่งหนึ่ง กระบวนการนี้เรียกว่าการแก้ไขพร้อมกัน



ให้เราดูสองระบบที่เกี่ยวข้องกับหัวข้อข้างต้นอย่างรวดเร็วก่อนที่จะเข้าสู่รายละเอียดของสิ่งเดียวกัน

ล้มเหลวอย่างรวดเร็ว Sysetm:

ระบบจะระบุว่าระบบล้มเหลวอย่างรวดเร็วหากระบบปิดลงทันทีหลังจากเกิดข้อผิดพลาด การดำเนินการจะถูกยกเลิกทันทีและความล้มเหลวหรือข้อผิดพลาดจะถูกเปิดเผย

ระบบ Fail Safe:

ระบบจะระบุว่าเป็นระบบที่ไม่ปลอดภัยหากระบบยังคงทำงานต่อไปแม้ว่าจะเกิดข้อผิดพลาดหรือเกิดข้อผิดพลาดก็ตาม พวกเขาจะไม่ยกเลิกการดำเนินการและซ่อนข้อผิดพลาดแทนที่จะเปิดเผย



Iterators ใน java ช่วยให้เราสามารถสำรวจวัตถุ Collection ได้ ตัววนซ้ำที่คอลเลกชันส่งคืนอาจล้มเหลวอย่างรวดเร็วหรือล้มเหลวอย่างปลอดภัยโดยธรรมชาติ

Fail Fast Iterator

ตัวทำซ้ำอย่างรวดเร็วล้มเหลวใน Java ไม่อนุญาตให้มีการปรับเปลี่ยนโครงสร้างใด ๆ ในคอลเล็กชันในขณะที่ทำซ้ำ การปรับเปลี่ยนโครงสร้างรวมถึงการเพิ่มลบหรืออัปเดตองค์ประกอบใด ๆ ในคอลเล็กชันในขณะที่ทำซ้ำ ตัววนซ้ำจะพ่น ConcurrentModificationException หากคอลเลกชันมีการปรับเปลี่ยนโครงสร้างในระหว่างกระบวนการทำซ้ำ

อย่างไรก็ตามต้องสังเกตว่าหากรายการถูกลบโดยใช้วิธีการวนซ้ำของตัวเองนั่นคือวิธีการลบ () จะไม่มีข้อยกเว้นใด ๆ เกิดขึ้น เป็นกระบวนการที่ปลอดภัยทั้งหมด ให้แน่ใจว่าคุณมี ติดตั้ง java แล้ว ในระบบของคุณ

ตัวอย่าง Fail Fast Iterator:

import java.util.HashMap import java.util.Iterator import java.util.Map คลาสสาธารณะ FailFastExample {public static void main (String [] args) {Map monthIndex = new HashMap () monthIndex.put ('1', 'January ') monthIndex.put (' 2 ',' กุมภาพันธ์ ') monthIndex.put (' 3 ',' March ') Iterator iterator = monthIndex.keySet (). iterator () while (iterator.hasNext ()) {System.out .println (monthIndex.get (iterator.next ())) // การเพิ่มองค์ประกอบลงในแผนที่ // ข้อยกเว้นจะถูกโยนในการโทรครั้งต่อไป // ของวิธีการถัดไป () monthIndex.put ('4', 'เมษายน')}}}

เอาท์พุต:

ข้อยกเว้นในเธรด“ main” java.util.ConcurrentModificationException

ที่ java.util.HashMap $ HashIterator.nextEntry (ไม่ทราบแหล่งที่มา)

สิ่งที่สามารถต่อเนื่องกันได้ใน java

ตอนนี้ให้เราไปดู Fail Safe Iterator

Fail Safe Iterator

ไม่เหมือนกับการทำซ้ำ Fail Fast ตัววนซ้ำแบบ Fail Safe จะไม่ทิ้งข้อยกเว้นใด ๆ หากมีการแก้ไขคอลเล็กชันในระหว่างกระบวนการทำซ้ำ นี่เป็นเพราะพวกเขาทำซ้ำบนโคลนของคอลเลกชันแทนที่จะเป็นคอลเลกชันจริง การปรับเปลี่ยนโครงสร้างที่ทำในคอลเลกชันจริงไม่มีใครสังเกตเห็น

อย่างไรก็ตามควรสังเกตว่าไม่มีสิ่งที่เรียกว่า Fail Safe Iterator อย่างแท้จริง มันจะเหมาะสมที่จะเรียกว่าเป็นจุดอ่อน - สอดคล้องกัน นี่ก็หมายความว่า ถ้า มีการแก้ไขคอลเล็กชันในระหว่างขั้นตอนการทำซ้ำสิ่งที่ Iterator เห็นนั้นรับประกันได้ว่าอ่อนแอ ลักษณะการทำงานนี้แตกต่างกันสำหรับคอลเลกชันที่แตกต่างกันและมีการบันทึกไว้ใน Javadocs

ตัวอย่าง Fail Safe Iterator:

คลาสสาธารณะ FailSafeExample {public static void main (String [] args) {ConcurrentMap monthIndex = new ConcurrentHashMap () monthIndex.put ('1', 'January') monthIndex.put ('2', 'February') monthIndex.put ( '3', 'มีนาคม') Iterator iterator = monthIndex.keySet (). iterator () while (iterator.hasNext ()) {System.out.println (monthIndex.get (iterator.next ())) monthIndex.put ( '4', 'เมษายน')}}}

เอาท์พุต:

  • มกราคม
  • กุมภาพันธ์
  • มีนาคม

สุดท้ายในบทความนี้เราจะเปรียบเทียบตัวทำซ้ำเหล่านี้

ความแตกต่าง: Fail Fast and Fail Safe Iterator

ด้านล่างนี้คือความแตกต่างที่สำคัญระหว่างตัวทำซ้ำสองตัว:

พารามิเตอร์ Fail Fast Iterator Fail Safe Iterator
โยนพร้อมกัน

ใช่พวกเขาโยน CocurrentModificationExcepti-on หากคอลเลกชันถูกแก้ไขในขณะที่ทำซ้ำ

ไม่พวกเขาจะไม่ทิ้งข้อยกเว้นใด ๆ หากมีการแก้ไขคอลเล็กชันในขณะที่ทำซ้ำ

โคลนคอลเลคชัน

ไม่พวกเขาใช้คอลเลกชันดั้งเดิมเพื่อสำรวจองค์ประกอบต่างๆ

ใช่พวกเขาใช้สำเนาของคอลเลกชันดั้งเดิมเพื่อสำรวจ

หน่วยความจำเหนือศีรษะ

ไม่พวกเขาไม่ต้องการหน่วยความจำเพิ่มเติม

ใช่พวกเขาต้องการหน่วยความจำเพิ่มเติมในการโคลนคอลเลคชัน

ตัวอย่าง

HashMap, Vector, ArrayList, HashSet

CopyOnWriteArrayList

ตัววนซ้ำเหล่านี้ทั้งไม่ซ้ำใครและจำเป็นมากในภาษา java ที่หลากหลาย แม้ว่าความล้มเหลวปลอดภัยจะมีวงแหวนที่ปลอบประโลม แต่ตัววนซ้ำแบบเร็วที่ล้มเหลวก็พิสูจน์ได้ว่ามีประสิทธิภาพ

ซึ่งจะนำไปสู่ตอนท้ายของบทความนี้ ในกรณีที่คุณต้องการเรียนรู้เพิ่มเติมโปรดดูไฟล์ โดย Edureka หลักสูตรการฝึกอบรมและการรับรอง Java J2EE และ SOA ของ Edureka ได้รับการออกแบบมาเพื่อให้คุณเริ่มต้นการเขียนโปรแกรม Java และฝึกอบรมแนวคิด Java ทั้งหลักและขั้นสูงพร้อมกับเฟรมเวิร์ก Java ต่างๆเช่น Hibernate & Spring

มีคำถามสำหรับเรา? โปรดระบุไว้ในส่วนความคิดเห็นของบล็อก 'Fail Fast vs Fail Safe' และเราจะติดต่อกลับโดยเร็วที่สุด