مثل خريطة الحاوية في Java:
ل(شخص شخص: قائمة pList){
إذا(person.getGender()==Gender.MALE){
pList.remove(person); // لا يمكن إجراء عملية الإزالة أثناء الاجتياز
}
}
عند اجتياز الخريطة، عادةً ما تحصل على مجموعة من قيمها الأساسية، ثم تستخدم مكررًا لاجتياز الخريطة.
لاحظ أنه أثناء عملية الاجتياز، يمكن معالجة العناصر الموجودة في الخريطة فقط وفقًا لذلك، ولا يمكن إضافة عناصر الخريطة أو تقليلها، وبعبارة أخرى، لا يمكن تغيير حجم الخريطة، وسيحدث استثناء (لا يمكن استخدامه أثناء عملية الاجتياز). عملية الاجتياز (تعديل أو حذف أو إضافة عناصر في الخريطة)
الاستثناء الذي تم الإبلاغ عنه هو استثناء java.util.ConcurrentModificationException
الفئة العامة ConcurrentModificationExceptionextends RuntimeException
يتم طرح هذا الاستثناء عندما تكتشف إحدى الطرق تعديلًا متزامنًا لكائن ما، ولكنها لا تسمح بمثل هذا التعديل.
على سبيل المثال، أثناء قيام أحد الخيوط بالتكرار عبر مجموعة، لا يُسمح عادةً لخيط آخر بتعديل المجموعة خطيًا. في كثير من الأحيان، في هذه الحالات، تكون نتائج التكرار غير واضحة. قد تختار بعض تطبيقات التكرار (بما في ذلك جميع تطبيقات المجموعة العامة المقدمة من JRE) طرح هذا الاستثناء إذا تم اكتشاف هذا السلوك. تسمى التكرارات التي تقوم بهذه العملية مكررات سريعة الفشل لأن المكرر يفشل بسرعة كاملة دون المخاطرة بسلوك عشوائي غير محدد في وقت ما في المستقبل.
لاحظ أن هذا الاستثناء لن يشير دائمًا إلى أنه تم تعديل الكائن بشكل متزامن بواسطة مؤشرات ترابط مختلفة. قد يطرح الكائن هذا الاستثناء إذا أصدر مؤشر ترابط واحد سلسلة من استدعاءات الأسلوب التي تنتهك عقد الكائن. على سبيل المثال، إذا قام مؤشر ترابط بتعديل مجموعة مباشرة أثناء التكرار عليها باستخدام مكرر سريع الفشل، فسيطرح المكرر هذا الاستثناء.
لاحظ أن سلوك الفشل السريع للمكررات غير مضمون لأنه، بشكل عام، ليس من الممكن تقديم أي ضمانات صارمة حول ما إذا كانت التعديلات المتزامنة غير المتزامنة ستحدث أم لا. ترمي العمليات السريعة الفشل ConcurrentModificationException على أساس أفضل جهد. لذلك، من الخطأ كتابة برنامج يعتمد على هذا الاستثناء لتحسين صحة مثل هذه العمليات. النهج الصحيح هو: يجب استخدام ConcurrentModificationException فقط لاكتشاف الأخطاء.
عند محاولة تعديل محتويات مجموعة/خريطة مباشرة أثناء استخدام مكرر سريع الفشل للتكرار عبر مجموعة أو خريطة، سيتم طرح استثناء java.util.ConcurrentModificationException حتى عند التشغيل ضمن مؤشر ترابط واحد.
يعمل التكرار في سلسلة رسائل منفصلة ويحتوي على قفل كائن المزامنة (mutex lock). بعد إنشاء Iterator، سيتم إنشاء جدول فهرس أحادي الارتباط يشير إلى الكائن الأصلي. عندما يتغير عدد الكائنات الأصلية، لن تتغير محتويات جدول الفهرس هذا بشكل متزامن، لذلك عندما يتحرك مؤشر الفهرس للخلف، لا يمكن أن يتغير. تم العثور عليه لتكرار الكائن، لذلك وفقًا لمبدأ الفشل السريع، سيقوم Iterator فورًا بطرح استثناء java.util.ConcurrentModificationException.
لذلك، لا يسمح التكرار بتغيير الكائن المكرر أثناء عمله. ولكن يمكنك استخدام طريقة Iterator الخاصة بحذف () لحذف الكائنات. ستقوم طريقة Iterator.remove () بحذف كائن التكرار الحالي مع الحفاظ على تناسق الفهرس.
الأمر المثير للاهتمام هو أنه إذا كان كائن المجموعة/الخريطة الخاص بك يحتوي بالفعل على عنصر واحد فقط، فلن يتم طرح استثناء ConcurrentModificationException. ولهذا السبب تمت الإشارة إليه في javadoc: سيكون من الخطأ كتابة برنامج يعتمد على هذا الاستثناء من أجل صحته: يجب استخدام ConcurrentModificationException فقط لاكتشاف الأخطاء.