نوٽ جو ليکڪ گرزيگورز ميرڪ آهي، جيڪو ڪرڪو (پولينڊ) مان هڪ سافٽ ويئر ڊولپر آهي. هن تقريباً 6 سال اڳ جاوا ۾ ترقي ڪرڻ شروع ڪئي، جڏهن ته اڃا يونيورسٽيءَ ۾ هو، ۽ ان وقت کان وٺي هن علائقي ۾ پنهنجي صلاحيتن کي نهايت محنت سان پالي رهيو آهي. هو خاص طور تي JVM ڪارڪردگي ۽ اصلاح ۾ دلچسپي رکي ٿو، جيڪو هن جي بلاگ تي خاص طور تي لکي ٿو .
جاوا جا ڪجهه مشهور انٽرويو سوالن ۾ شامل آهن: ناڪام-تيز ۽ ناڪام-محفوظ آئٽرٽرز جي وچ ۾ ڇا فرق آهي؟ ان جو سڀ کان وڌيڪ آسان جواب آهي: هڪ ناڪام-تيز آئيٽرٽر هڪ ConcurrentModificationException اڇلائي ٿو جيڪڏهن مجموعو iteration دوران تبديل ٿئي ٿو، پر هڪ ناڪام-محفوظ آئٽرٽر نٿو ڪري. جيتوڻيڪ اهو آواز ڪافي معنيٰ وارو آهي، اهو واضح ناهي ته انٽرويو وٺندڙ جو مطلب ڇا آهي ناڪام-محفوظ؟ Java Language Specifications هن اصطلاح جي وضاحت نه ڪندا آهن اُچارن جي حوالي سان. تنهن هوندي به، چار مقابلي ۾ ترميمي حڪمت عمليون آهن.
مقابلي واري تبديلي
پهرين، اچو ته وضاحت ڪريون ته مقابلي واري (يا متوازي) ترميم ڇا آهي. اچو ته چئون ته اسان وٽ هڪ مجموعو آهي ۽ جڏهن ائٽيٽر فعال هوندو آهي، ڪجهه تبديليون اينديون آهن جيڪي هن آئٽرٽر مان نه اينديون آهن. انهي حالت ۾، اسان هڪ مقابلي واري تبديلي حاصل ڪندا آهيون. اچو ته توهان کي هڪ سادي مثال ڏيان: اچو ته چئو ته اسان وٽ ڪيترائي موضوع آهن. پھريون ڌاڳو ٻيهر ورجائي ٿو، ۽ ٻيو ٿريڊ ساڳئي مجموعي مان عناصر داخل ڪري ٿو يا ختم ڪري ٿو. تنهن هوندي، اسان حاصل ڪري سگهون ٿا ConcurrentModificationException جڏهن هڪ واحد موضوع واري ماحول ۾ هلندي:List<String> cities = new ArrayList<>();
cities.add(“Warsaw”);
cities.add(“Prague”);
cities.add(“Budapest”);
Iterator<String> cityIterator = cities.iterator();
cityIterator.next();
cities.remove(1);
cityIterator.next(); // генерирует ConcurrentModificationException
تڪڙا تڪڙا
مٿي ڏنل ڪوڊ جو ٽڪرو هڪ ناڪام فاسٽ آئٽرٽر جو هڪ مثال آهي. جئين توهان ڏسي سگهو ٿا، هڪ ConcurrentModificationException اڇلايو ويو جڏهن ٻئي عنصر کي ٻيهر حاصل ڪرڻ جي ڪوشش ڪئي وئي آئيٽرٽر . هڪ ائٽريٽر ڪيئن ڄاڻي ٿو ته مجموعو تبديل ڪيو ويو آهي جڏهن کان اهو ٺاهيو ويو آهي؟ مثال طور، مجموعي ۾ تاريخ/ٽائم اسٽمپ ٿي سگھي ٿي، چئو lastModified . جڏهن هڪ آئٽرٽر ٺاهي، توهان کي هن فيلڊ کي نقل ڪرڻ گهرجي ۽ ان کي هڪ آئٽرٽر اعتراض ۾ ذخيرو ڪرڻ گهرجي. پوءِ، هر دفعي ايندڙ() طريقي کي سڏيو ويندو آهي، توهان آسانيءَ سان گڏ ڪرڻ جي آخري ترميمي قدر جو مقابلو ڪندا ائٽرٽر جي ڪاپي سان. ھڪڙو بلڪل ساڳيو طريقو استعمال ڪيو ويو آھي، مثال طور، ArrayList طبقي جي عمل ۾ . ان ۾ ھڪڙو مثال آھي متغير modCount جيڪو ذخيرو ڪري ٿو تعداد جو تعداد لسٽ کي تبديل ڪيو ويو آھي:final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
اهو نوٽ ڪرڻ ضروري آهي ته ناڪام-تيز آئيٽرٽر هڪ بهترين نسل جي بنياد تي هلن ٿا، مطلب ته اها ڪا به گارنٽي نه آهي ته هڪ سمورو ترميم جي صورت ۾ هڪ ConcurrentModificationException اڇلايو ويندو. تنهن ڪري توهان کي انهن تي ڀروسو نه ڪرڻ گهرجي - بلڪه، انهن کي استعمال ڪيو وڃي غلطيون ڳولڻ لاءِ. گھڻا غير سمورو مجموعا ناڪام-تيز آئيٽرٽر مهيا ڪن ٿا.
ڪمزور مطابقت
java.util.concurrent پيڪيج ۾ اڪثر سمورو مجموعو (جهڙوڪ ConcurrentHashMap ۽ سڀ کان وڌيڪ قطار ) ضعيف طور تي هڪجهڙائي وارا اکر مهيا ڪن ٿا. هن اصطلاح جي معنيٰ تمام چڱيءَ طرح بيان ڪيل دستاويز ۾ ڏنل آهي :- انهن کي ٻين عملن سان گڏوگڏ عمل ڪري سگهجي ٿو
- اهي ڪڏهن به هڪ ConcurrentModificationException اڇليندا آهن
- اهي ضمانت آهن ته موجوده عنصرن کي ٽريڪ ڪرڻ جي وقت تي جڏهن آئٽرٽر هڪ ڀيرو ٺاهيو ويو هو، ۽ ڪري سگهن ٿا (پر گهربل نه آهي) بعد ۾ تبديلين کي ظاهر ڪن ٿا.
GO TO FULL VERSION