CodeGym /Blog Java /rawak /ConcurrentModificationException dalam Java
John Squirrels
Tahap
San Francisco

ConcurrentModificationException dalam Java

Diterbitkan dalam kumpulan

Apakah ConcurrentModificationException dalam Java?

"ConcurrentModificationException berlaku apabila sumber diubah suai sementara tidak mempunyai keistimewaan pengubahsuaian."
Dalam erti kata lain, Java ConcurrentModificationException (seperti namanya) berlaku kerana masalah konkurensi. Diandaikan bahawa anda mempunyai pengetahuan awal tentang benang dan berbilang benang sebelum meneruskan. Sesetengah kelas dalam Java, seperti kelas Koleksi, tidak membenarkan utas untuk mengubah suai elemen sementara satu lagi utas sedang berulang ke atasnya. Jika operasi pengubahsuaian (tambah, keluarkan dll) dilakukan, atur cara membuang ConcurrentModificationException . Ini bukan satu-satunya kes untuk pengecualian ini berlaku. Walau bagaimanapun, menggali lebih mendalam akan keluar dari skop artikel ini.

Contoh

Mari kita lihat contoh bagaimana pengecualian ini berlaku.

import java.util.List;
import java.util.Iterator;
import java.util.ArrayList;

//Test driver for ConcurrentModificationException
public class ConcurrentModificationExceptionTestDriver1 {

	public static void main(String[] args) {
		List<String> businessDays = new ArrayList<>();

		businessDays.add("Monday");
		businessDays.add("Tuesday");
		businessDays.add("Wednesday");
		businessDays.add("Thursday");
		businessDays.add("Friday");
		businessDays.add("Saturday");
		businessDays.add("Sunday");

		Iterator<String> iterator = businessDays.iterator();
		while (iterator.hasNext()) {
			String day = iterator.next();
			if (day.equals("Sunday")) {
				// removing a list item while iterating
				// leading to java.util.ConcurrentModificationException
				businessDays.remove(day);
			}
		}
	}
}

Pengeluaran

Pengecualian dalam benang "utama" java.util.ConcurrentModificationException di java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042) di java.base/java.util.ArrayList$Itr.next(ArrayList.java :996) di milestone.thirty.seven.ConcurrentModificationExceptionTestDriver1.main(ConcurrentModificationExceptionTestDriver1.java:22)

Bagaimana untuk Mengelakkan ConcurrentModificationException di Java?

Terdapat penyelesaian yang berbeza untuk ConcurrentModificationException . Berikut adalah beberapa yang disenaraikan. Anda boleh memilih sesiapa sahaja mengikut keperluan anda.
  1. Elakkan pengubahsuaian semasa lelaran.
  2. Gunakan gelung tradisional untuk lelaran dan pengubahsuaian serentak.
  3. Buat salinan nilai untuk diubah suai semasa menggunakan iterator. Kemas kini nilai setelah lelaran tamat.

Contoh

Berikut ialah contoh cara anda boleh mengelakkan ConcurrentModificationException .

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

//Test driver for ConcurrentModificationException
public class ConcurrentModificationExceptionTestDriver2 {

	public static void main(String[] args) {

		List<String> businessDays = new ArrayList<>();

		businessDays.add("Monday");
		businessDays.add("Tuesday");
		businessDays.add("Wednesday");
		businessDays.add("Thursday");
		businessDays.add("Friday");
		businessDays.add("Saturday");
		businessDays.add("Sunday");
		
		System.out.println("Initial Business Days: " + businessDays);

		// Method II - Using traditional for loop
		for (int i = 0; i < businessDays.size(); i++) {
			if (businessDays.get(i).equals("Sunday")) {
				businessDays.remove(i);
			}
		}
		
		Iterator<String> iterator = businessDays.iterator();
		List<String> businessDaysToBeRemoved = new ArrayList<>();

		// Method III - Creating a copy of elements 
		while (iterator.hasNext()) {
			String day = iterator.next();
			if (day.equals("Saturday")) {
				// Add values to be removed in the list
				businessDaysToBeRemoved.add(day);
			}
		}	
		businessDays.removeAll(businessDaysToBeRemoved);
		System.out.println("Final Business Days: " + businessDays);
	}
}

Pengeluaran

Hari Perniagaan Permulaan: [Isnin, Selasa, Rabu, Khamis, Jumaat, Sabtu, Ahad] Hari Perniagaan Akhir: [Isnin, Selasa, Rabu, Khamis, Jumaat]

Kesimpulan

Itu adalah dos pantas untuk menangani ConcurrentModificationException di Java. Jangan ragu untuk melompat pada bila-bila masa anda rasa tersekat. Seperti biasa, kunci untuk bergerak ke hadapan adalah latihan dan kesabaran. Sehingga itu, teruskan belajar dan terus berkembang.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION