التكرارات الآمنة في Java: ما هو الفرق؟



ستساعدك هذه المقالة حول 'التكرار الآمن للفشل والفشل' في مقارنة هذين التكررين بالتفصيل مع الأمثلة ذات الصلة.

دعم نوعين من التكرارات ، الأول هو الفشل السريع والثاني الفشل الآمن. تلعب هذه دورًا حيويًا عندما يتعلق الأمر بمعالجة الاستثناءات في Java. في هذه المقالة حول 'التكرار الآمن للفشل والفشل' ، سنحلل عمل المكررين بالإضافة إلى الاختلاف الأساسي بينهما.

فيما يلي المؤشرات التي ستتم مناقشتها في هذه المقالة:





قبل الدخول في شرح مفصل ، دعنا نتعرف على مفهوم التعديل المتزامن.

التعديل المتزامن

عندما يتكرر خيط واحد (أو خيوط متعددة) عبر مجموعة ، فإنه يمكن أن يغير بنية المجموعة ، إما عن طريق إضافة أو حذف عنصر في المجموعة ، أو عن طريق تحديث قيمة العنصر في موضع معين. تُعرف هذه العملية بالتعديل المتزامن.



دعونا نلقي نظرة سريعة على النظامين اللذين يتعلقان بالموضوع أعلاه ، قبل الدخول في تفاصيله ،

فشل نظام سريع:

يتم تسمية النظام على أنه نظام سريع الفشل ، إذا تم إيقاف تشغيله فور حدوث خطأ. يتم إحباط العمليات على الفور ويتم كشف الإخفاقات أو الأخطاء.

النظام الآمن من الفشل:

يتم تصنيف النظام على أنه نظام آمن من الفشل ، إذا استمر في العمل حتى بعد حدوث خطأ أو خطأ. إنهم لا يجهضون عملية ويخفون الأخطاء بدلاً من كشفها.



جافا لقوة

تسمح لنا التكرارات في جافا بالمرور عبر كائنات المجموعة. التكرارات التي تعيدها المجموعة إما تفشل بسرعة أو تفشل بأمان بطبيعتها.

فشل التكرار السريع

لا تسمح التكرارات السريعة الفاشلة في Java بأي نوع من التعديل الهيكلي لمجموعة أثناء التكرار عليها. يتضمن التعديل الهيكلي إضافة أو إزالة أو تحديث أي عنصر في المجموعة أثناء التكرار فوقه. يقوم المكرر بإلقاء ConcurrentModificationException ، إذا تم تعديل مجموعة هيكليًا أثناء عملية التكرار.

ومع ذلك ، تجدر الإشارة إلى أنه في حالة إزالة عنصر باستخدام طريقة التكرارات الخاصة ، أي طريقة الإزالة () ، فلن يتم طرح أي استثناء. إنها عملية آمنة تمامًا. تأكد لديك java مثبتة على نظامك

مثال على التكرار السريع للفشل:

import java.util.HashMap import java.util.Iterator import java.util.Map public class FailFastExample {public static void main (String [] args) {Map monthIndex = new HashMap () monthIndex.put ('1'، 'January ') monthIndex.put (' 2 '،' February ') monthIndex.put (' 3 '،' March ') Iterator iterator = monthIndex.keySet (). iterator () while (iterator.hasNext ()) {System.out .println (monthIndex.get (iterator.next ())) // إضافة عنصر إلى Map // سيتم طرح الاستثناء في الاستدعاء التالي // من الطريقة التالية (). monthIndex.put ('4'، 'April')}}}

انتاج:

استثناء في الموضوع 'main' java.util.ConcurrentModificationException

في java.util.HashMap $ HashIterator.nextEntry (مصدر غير معروف)

الآن ، دعونا نمضي قدمًا ونلقي نظرة على Fail Safe Iterator ،

التكرار الآمن للفشل

بخلاف متكررات Fail Fast ، لا تطرح متكررات Fail Safe أي استثناءات إذا تم تعديل المجموعة أثناء عملية التكرار. هذا يرجع إلى حقيقة أنها تتكرر على نسخة المجموعة ، بدلاً من المجموعة الفعلية. التعديلات الهيكلية التي تم إجراؤها على المجموعة الفعلية تمر دون أن يلاحظها أحد.

ومع ذلك ، يجب ملاحظة أنه لا يوجد شيء مثل مكرر آمن حقًا. سيكون من المناسب وصفه بأنه ضعيف الاتساق. هذا يعني ذلك ببساطة إذا يتم تعديل المجموعة أثناء عملية التكرار ، ما يراه التكرار مضمون بشكل ضعيف. يختلف هذا السلوك باختلاف المجموعات ويتم توثيقه في جافادوكس.

مثال على التكرار الآمن للفشل:

الفئة العامة FailSafeExample {public static void main (String [] args) {ConcurrentMap monthIndex = new ConcurrentHashMap () monthIndex.put ('1'، 'January') monthIndex.put ('2'، 'February') monthIndex.put ( '3'، 'March') Iterator iterator = monthIndex.keySet (). iterator () while (iterator.hasNext ()) {System.out.println (monthIndex.get (iterator.next ())) monthIndex.put ( '4'، 'أبريل')}}}

انتاج:

  • كانون الثاني
  • شهر فبراير
  • مارس

أخيرًا في هذه المقالة سنقارن بين هذه التكرارات ،

الاختلافات: التكرار الآمن والفشل السريع

فيما يلي الاختلافات الأساسية بين المتكررين:

المعلمات فشل التكرار السريع التكرار الآمن للفشل
رمي استثناء التعديل المتزامن

نعم ، إنهم يرمون CocurrentModificationExcepti-on إذا تم تعديل مجموعة أثناء التكرار عليها.

لا ، لا يطرحون أي استثناء إذا تم تعديل المجموعة أثناء التكرار عليها.

استنساخ المجموعة

لا ، يستخدمون المجموعة الأصلية لاجتياز العناصر.

نعم ، يستخدمون نسخة المجموعة الأصلية لاجتيازها.

الذاكرة العلوية

لا ، فهي لا تتطلب ذاكرة إضافية.

نعم ، تتطلب ذاكرة إضافية لاستنساخ المجموعة.

أمثلة

HashMap ، Vector ، ArrayList ، HashSet

CopyOnWriteArrayList

هذه التكرارات فريدة من نوعها ومطلوبة بشدة في لغة جافا متعددة الاستخدامات. على الرغم من وجود حلقة مريحة لها ، إلا أن مكرر الفشل السريع يثبت أنه قوي.

هذا يصل إلى نهاية هذه المقالة. في حال كنت ترغب في معرفة المزيد ، تحقق من بواسطة Edureka. تم تصميم دورة تدريب وشهادة Java J2EE و SOA من Edureka لمنحك بداية قوية في برمجة Java وتدريبك على مفاهيم Java الأساسية والمتقدمة جنبًا إلى جنب مع العديد من أطر Java مثل Hibernate & Spring.

لديك سؤال لنا؟ يرجى ذكر ذلك في قسم التعليقات في مدونة 'Fail Fast vs Fail Safe' وسنعاود الاتصال بك في أقرب وقت ممكن.