Pengecualian Pengubahsuaian Serentak dalam Java
Apabila bekerja dengan aplikasi berbilang benang atau mengulangi koleksi di Java, adalah penting untuk mengelakkan pengubahsuaian serentak. Pengubahsuaian serentak merujuk kepada melakukan perubahan pada koleksi semasa pengubah sedang giat mengulangi koleksi yang sama.
Pertimbangkan coretan kod berikut untuk menggambarkan isu ini:
import java.util.*; public class SomeClass { public static void main(String[] args) { List<String> s = new ArrayList<>(); ListIterator<String> it = s.listIterator(); for (String a : args) s.add(a); if (it.hasNext()) String item = it.next(); System.out.println(s); } }
Kod ini cuba mengulangi atas senarai menggunakan ListIterator. Walau bagaimanapun, pengecualian pengubahsuaian serentak boleh berlaku jika elemen baharu ditambahkan pada senarai (s.add(a)) semasa iterator (ia) sedang digunakan untuk melintasi senarai.
Untuk menyelesaikan isu ini, Java menyediakan iterator yang gagal-cepat. Setiap kali iterator cuba mengakses koleksi, ia menyemak sama ada koleksi telah ditukar melebihi akses awal iterator itu. Jika koleksi diubah suai dalam apa jua cara di luar titik akses iterator, pengecualian ConcurrentModificationException akan dilemparkan.
Coretan kod dikemas kini yang mengelakkan pengecualian pengubahsuaian serentak diberikan di bawah:
import java.util.*; public class SomeClass { public static void main(String[] args) { List<String> s = new ArrayList<>(); for(String a : args) s.add(a); ListIterator<String> it = s.listIterator(); if(it.hasNext()) { String item = it.next(); } System.out.println(s); } }
Adalah penting untuk diingat bahawa ListIterator tidak mampu mengenal pasti pengubahsuaian yang berlaku sebelum iterator dibuat, hanya pengubahsuaian yang berlaku semasa iterator sedang digunakan. Selain itu, iterator tidak menghalang pengubahsuaian serentak daripada berlaku, sebaliknya mengesannya dan membuang pengecualian apabila ia berlaku. Untuk mengelakkan pengubahsuaian serentak sepenuhnya, mekanisme penyegerakan harus digunakan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengelakkan ConcurrentModificationException Apabila Mengulangi Koleksi di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!