Rumah > Java > javaTutorial > teks badan

Bagaimana untuk menyelesaikan pengecualian pengubahsuaian serentak Java (ConcurrentModificationException)

WBOY
Lepaskan: 2023-08-19 10:25:44
asal
1891 orang telah melayarinya

Bagaimana untuk menyelesaikan pengecualian pengubahsuaian serentak Java (ConcurrentModificationException)

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();
    }
}
Salin selepas log masuk

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());
    }
}
Salin selepas log masuk

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);
        }
    }
}
Salin selepas log masuk

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);
    }
}
Salin selepas log masuk

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

  1. "Bagaimana untuk menyelesaikan ConcurrentModificationException di Java", Baeldung, https://www.baeldung.com/java-concurrentmodificationexception
  2. "ConcurrentModificationException di Java – Bagaimana untuk mengelakkannya?", JournalDev, https //www.journaldev.com/378/how-to-avoid-concurrentmodificationexception-in-java

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan