Rumah > Java > javaTutorial > ConcurrentModificationException semasa menggunakan Iterator di Java

ConcurrentModificationException semasa menggunakan Iterator di Java

DDD
Lepaskan: 2025-02-07 11:18:10
asal
729 orang telah melayarinya

ConcurrentModificationException while using Iterator in Java

Dalam persekitaran Java multithreaded, cuba mengubahsuai koleksi semasa melangkah ke atasnya menggunakan iterator boleh membawa kepada

. Pengecualian ini timbul kerana keadaan dalaman koleksi menjadi tidak konsisten. ConcurrentModificationException

Inilah contoh yang menggambarkan pengecualian:

<code class="language-java">Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:000)
at java.base/java.util.ArrayList$Itr.next(ArrayList.java:000)
at com.journaldev.ConcurrentModificationException.ConcurrentModificationExceptionExample.main(ConcurrentModificationExceptionExample.java:00)</code>
Salin selepas log masuk
Pengecualian ini berlaku di bawah syarat -syarat ini:

    Pengubahsuaian semasa lelaran: Iterator tidak direka untuk pengubahsuaian serentak.
  • Iterator Fail-Fast: Iterator menggunakan bendera dalaman (
  • ) untuk mengesan pengubahsuaian dan melemparkan pengecualian. modCount

algoritma untuk menghasilkan semula pengecualian

Algoritma ini menunjukkan cara mencetuskan

di Java: ConcurrentModificationException

  1. Inisialisasi: Buat . ArrayList
  2. Penduduk: Tambah elemen ke . ArrayList
  3. iTeration: Dapatkan pengatur menggunakan . list.iterator()
  4. Pengubahsuaian: Di dalam gelung lelaran, ubah suai (mis., Tambah atau keluarkan elemen). ArrayList
  5. Pengecualian: dibuang apabila iterator mengesan pengubahsuaian. ConcurrentModificationException
  6. Contoh kod CODE: mencetuskan pengecualian

Kod ini akan membuang

kerana
<code class="language-java">import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ConcurrentModificationExample {
    public static void main(String[] args) {
        List<integer> myList = new ArrayList<>();
        myList.add(1);
        myList.add(2);
        myList.add(3);

        Iterator<integer> iterator = myList.iterator();
        while (iterator.hasNext()) {
            Integer value = iterator.next();
            System.out.println("Value: " + value);
            if (value == 2) {
                myList.remove(value); // Modification during iteration!
            }
        }
    }
}</integer></integer></code>
Salin selepas log masuk
mengubah suai senarai sementara iterator melintasinya.

ConcurrentModificationException myList.remove(value) Teknik pengubahsuaian selamat

Untuk mengelakkan pengecualian ini, gunakan pendekatan ini:

  • :

    Gunakan kaedah untuk menghapuskan unsur -unsur semasa lelaran. Kaedah ini selamat kerana ia direka untuk bekerja dengan keadaan dalaman iterator. Iterator.remove() iterator.remove()

  • Salin senarai:
  • Buat salinan senarai sebelum meleleh dan mengubah suai salinan.

  • Gunakan koleksi serentak:
  • Untuk senario pengubahsuaian serentak, gunakan koleksi selamat thread seperti

    atau . CopyOnWriteArrayList ConcurrentHashMap

  • blok disegerakkan:
  • memasukkan lelaran dan pengubahsuaian dalam blok yang disegerakkan untuk memastikan keselamatan benang.

    Contohnya: Penyingkiran selamat menggunakan

Kod yang disemak ini dengan selamat menghilangkan elemen tanpa membuang pengecualian. Ingatlah untuk memilih teknik yang sesuai berdasarkan keperluan khusus anda dan keperluan konvensional. Menggunakan koleksi serentak biasanya disukai untuk senario multithreaded. Iterator.remove()

Atas ialah kandungan terperinci ConcurrentModificationException semasa menggunakan Iterator di Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
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
Isu terkini
Bolehkah java digunakan sebagai bahagian belakang web?
daripada 1970-01-01 08:00:00
0
0
0
Tidak dapat memasang java
daripada 1970-01-01 08:00:00
0
0
0
Pasang JAVA
daripada 1970-01-01 08:00:00
0
0
0
Bagaimanakah php melaksanakan penyulitan sha1 java?
daripada 1970-01-01 08:00:00
0
0
0
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan