สนับสนุนตัวทำซ้ำสองประเภทประเภทแรกล้มเหลวอย่างรวดเร็วและแบบที่สองล้มเหลวอย่างปลอดภัย สิ่งเหล่านี้มีบทบาทสำคัญเมื่อพูดถึงการจัดการข้อยกเว้นใน 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' และเราจะติดต่อกลับโดยเร็วที่สุด