Cara menyelesaikan pengecualian pengubahsuaian serentak Java (ConcurrentModificationException)
Dalam pengaturcaraan Java, apabila berbilang benang mengubah suai objek kelas koleksi pada masa yang sama, adalah mudah untuk menyebabkan pengecualian "ConcurrentModificationException". Artikel ini menerangkan punca pengecualian dan menyediakan pelbagai penyelesaian dan contoh kod.
1. Punca pengecualian
1.1 Struktur kelas koleksi
ConcurrentModificationException pengecualian biasanya berlaku dalam kelas pengumpulan berasaskan iterator, seperti ArrayList, HashMap, dsb. Mereka menggunakan pembolehubah modCount secara dalaman untuk merekodkan bilangan kali koleksi telah diubah suai.
1.2 Pengubahsuaian serentak
Apabila satu utas sedang melakukan operasi berulang, utas lain menambah, memadam atau mengubah suai koleksi, sekali gus mengubah suai nilai modCount, menyebabkan iterator berfikir bahawa koleksi telah diubah suai, dan kemudian membuang ConcurrentModificationException pengecualian.
2. Penyelesaian
2.1 Gunakan kaedah alih keluar iterator
Pelajar dalam kelas koleksi Java menyediakan kaedah alih keluar, yang boleh mengalih keluar elemen yang sedang diulang daripada koleksi dengan selamat.
List<String> list = new ArrayList<>(); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String element = iterator.next(); if (condition) { iterator.remove(); } }
2.2 Menggunakan kelas pengumpulan serentak
Pakej serentak Java (java.util.concurrent) menyediakan satu siri kelas pengumpulan selamat benang, yang semuanya menggunakan mekanisme serentak yang berbeza untuk menyelesaikan masalah pengubahsuaian serentak.
Sebagai contoh, gunakan ConcurrentHashMap dan bukannya HashMap:
import java.util.concurrent.ConcurrentHashMap; ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>(); map.put("key1", "value1"); map.put("key2", "value2"); for (Map.Entry<String, String> entry : map.entrySet()) { if (condition) { map.remove(entry.getKey()); } }
2.3 Gunakan mekanisme penyegerakan
Gunakan kata kunci yang disegerakkan untuk menyegerakkan koleksi bagi memastikan hanya satu urutan boleh mengakses koleksi pada masa yang sama, dengan itu mengelakkan pengecualian pengubahsuaian serentak.
List<String> list = new ArrayList<>(); synchronized (list) { for (String element : list) { if (condition) { list.remove(element); } } }
2.4 Menggunakan CopyOnWriteArrayList
CopyOnWriteArrayList ialah kelas koleksi selamat benang yang mencipta salinan koleksi baharu semasa operasi tulis (tambah, padam, ubah suai), dengan itu mengelakkan pengecualian pengubahsuaian serentak.
import java.util.concurrent.CopyOnWriteArrayList; CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(); list.add("item1"); list.add("item2"); for (String element : list) { if (condition) { list.remove(element); } }
3. Ringkasan
Java Concurrent Modification Exception (ConcurrentModificationException) disebabkan oleh berbilang benang yang mengubah suai objek kelas koleksi pada masa yang sama. Untuk menyelesaikan masalah ini, anda boleh menggunakan kaedah alih keluar iterator, kelas pengumpulan serentak, mekanisme penyegerakan, atau CopyOnWriteArrayList dan kaedah lain. Pilih kaedah yang sesuai mengikut situasi sebenar untuk menyelesaikan pengecualian pengubahsuaian serentak dan memastikan kestabilan dan kebolehpercayaan program.
4. Rujukan
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan pengecualian pengubahsuaian serentak Java (ConcurrentModificationException). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!