כישלון מהיר ונכשל איטרטורים בג'אווה: מה ההבדל?



מאמר זה בנושא 'Fail Fast And Fail Safe Itterators' יעזור לכם להשוות את שני הטרדורים הללו בפירוט עם דוגמאות רלוונטיות.

תומך בשני סוגים של איטרטורים, הראשון נכשל במהירות והשני בטוח. אלה ממלאים תפקיד חיוני בכל הנוגע לטיפול חריג ב- Java. במאמר זה על 'כישלון מהיר וחסר כשלון', ננתח את פעולתם של שני האיטרטורים וכן את ההבדל המהותי ביניהם.

להלן המצביעים שיידונו במאמר זה:





כיצד לבנות אפליקציית מכירות

לפני שנכנס להסבר מפורט, בואו להכיר את הרעיון של שינוי מקביל.

שינוי מקביל

כאשר שרשור בודד (או מספר שרשורים), חוזר על אוסף, הוא יכול לשנות את מבנה האוסף, על ידי הוספה או מחיקה של האלמנט באוסף, או על ידי עדכון ערך האלמנט במיקום מסוים. תהליך זה מכונה שינוי מקביל.



בואו נסתכל במהירות על שתי המערכות הנוגעות לעיל לפני שנכנס לפרטים של אותה,

כישלון מערכת מהירה נכשלת:

מערכת מתויגת כמערכת כישלון מהיר, אם היא נכבתת מיד לאחר התרחשותה של שגיאה. הפעולות מבוטלות באופן מיידי והתקלות או השגיאות נחשפות.

מערכת כשל בטוחה:

מערכת מתויגת כמערכת בטוח כושלת, אם הם ממשיכים לפעול גם לאחר שהתרחשה תקלה או שגיאה. הם לא מבטלים פעולה ומסתירים את השגיאות במקום לחשוף אותן.



מלטים בג'אווה מאפשרים לנו לעבור על עצמי האוסף. האיטרטורים שהוחזרו על ידי האוסף נכשלים במהירות או בטוחים כשלים.

כישלון מהיר איטרטור

כישלונות איטרטורים מהירים ב- Java אינם מאפשרים כל סוג של שינוי מבני לאוסף תוך כדי איטרציה מעליו. שינוי מבני כולל הוספה, הסרה או עדכון של כל רכיב באוסף תוך כדי איטרציה מעליו. האיטרטור זורק ConcurrentModificationException, אם אוסף שונה באופן מבני בתהליך האיטרציה.

עם זאת, יש לציין שאם פריט מוסר בשיטת iterators משלו כלומר השיטה remove (), לא יוצא שום חריג. זהו תהליך בטוח לחלוטין. תוודא שיש לך java מותקן במערכת שלך

דוגמה לאיטרטור מהיר:

ייבא java.util.HashMap ייבא java.util.Iterator ייבוא ​​java.util.Map מחלקה ציבורית FailFastExample {public static void main (String [] args) {Map monthIndex = new HashMap () monthIndex.put ('1', 'ינואר ') monthIndex.put (' 2 ',' פברואר ') monthIndex.put (' 3 ',' מרץ ') איטרטור איטרטור = monthIndex.keySet (). iterator () ואילו (iterator.hasNext ()) {System.out .println (monthIndex.get (iterator.next ())) // הוספת אלמנט למפה // חריגה תיזרק בשיחה הבאה // של השיטה הבאה (). monthIndex.put ('4', 'אפריל')}}}

תְפוּקָה:

חריג בשרשור 'ראשי' java.util.ConcurrentModificationException

באתר java.util.HashMap $ HashIterator.nextEntry (מקור לא ידוע)

עכשיו בואו ונמשיך להסתכל על איטרטור Fail Safe,

איטרטור כשל בטוח

שלא כמו איטרטורים מהירים כישלון, איטרטורים כושלים בטוחים לא זורקים שום יוצא מהכלל אם האוסף משתנה במהלך התהליך. זאת בשל העובדה שהם חוזרים על שיבוט האוסף, במקום האוסף בפועל. השינויים המבניים שנעשו באוסף בפועל לא נבחנים מהם.

עם זאת, יש לשים לב כי אין דבר כזה איטרטור כשל בטוח. ראוי יהיה לכנות זאת כעקבית חלש. זה פשוט אומר את זה אם אוסף משתנה במהלך תהליך האיטרציה, מה שהאיטרטור רואה מובטח בצורה חלשה. התנהגות זו שונה באוספים שונים ומתועדת ב- Javadocs.

דוגמה לאינטרטור כשל בטוח:

מחלקה ציבורית FailSafeExample {public static void main (String [] args) {ConcurrentMap monthIndex = new ConcurrentHashMap () monthIndex.put ('1', 'January') monthIndex.put ('2', 'February') monthIndex.put ( '3', 'מרץ') איטרטור איטרטור = monthIndex.keySet (). Iterator () ואילו (iterator.hasNext ()) {System.out.println (monthIndex.get (iterator.next ())) monthIndex.put ( '4', 'אפריל')}}}

תְפוּקָה:

  • יָנוּאָר
  • פברואר
  • מרץ

לבסוף במאמר זה נשווה את האיטרטורים הללו,

הבדלים: כישלון מהיר ומחדל נכשל

להלן ההבדלים המהותיים בין שני האיטרטורים:

מה זה סורק בג'אווה
פרמטרים כישלון מהיר איטרטור איטרטור כשל בטוח
לזרוק חריגה משולבת

כן, הם זורקים את CocurrentModificationExcepti-on אם אוסף משתנה תוך כדי איטרציה מעליו.

לא, הם לא זורקים שום יוצא מן הכלל אם אוסף משתנה תוך כדי איטרציה עליו.

שיבט את האוסף

לא, הם משתמשים באוסף מקורי כדי לחצות את האלמנטים.

כן, הם משתמשים בעותק של האוסף המקורי כדי לעבור.

תקרת זיכרון

לא, הם לא דורשים זיכרון נוסף.

כן, הם דורשים זיכרון נוסף כדי לשכפל את האוסף.

דוגמאות

HashMap, Vector, ArrayList, HashSet

CopyOnWriteArrayList

איטרטורים אלה ייחודיים ונחוצים מאוד בשפה המגוונת של ג'אווה. אף על פי שכישלון בטוח מכיל טבעת מנחמת, איטרטור המהיר כושל מתגלה כחזק.

זה מביא לסוף מאמר זה. אם ברצונך ללמוד עוד, עיין ב מאת אדוריקה. קורס ההדרכה וההסמכה של Java J2EE ו- SOA של אדוריקה נועד לתת לך יתרון בתכנות Java ולהכשיר אותך למושגי ליבה מרכזיים ומתקדמים יחד עם מסגרות Java שונות כמו Hibernate & Spring.

יש לך שאלה עבורנו? אנא הזכיר זאת בסעיף ההערות בבלוג 'כישלון מהיר לעומת כשל בטוח' ונחזור אליך בהקדם האפשרי.