CodeGym /Java Blog /Random /ConcurrentModificationException sa Java
John Squirrels
Antas
San Francisco

ConcurrentModificationException sa Java

Nai-publish sa grupo

Ano ang ConcurrentModificationException sa Java?

"Ang ConcurrentModificationException ay nangyayari kapag ang isang mapagkukunan ay binago habang walang mga pribilehiyo ng pagbabago."
Sa madaling salita, Ang Java ConcurrentModificationException (tulad ng iminumungkahi ng pangalan) ay nangyayari dahil sa problema ng concurrency. Ipinapalagay na mayroon kang paunang kaalaman sa mga thread at multi-threading bago magpatuloy. Ang ilang mga klase sa Java, tulad ng mga klase ng Collection, ay hindi pinapayagan ang isang thread na baguhin ang isang elemento habang ang isa pang thread ay umuulit dito. Kung ang pagpapatakbo ng pagbabago (idagdag, alisin atbp) ay ginanap, ang programa ay naghagis ng ConcurrentModificationException . Hindi lang ito ang kaso para mangyari ang pagbubukod na ito. Gayunpaman, ang paghuhukay ng mas malalim ay lalabas sa saklaw ng artikulong ito.

Halimbawa

Tingnan natin ang isang halimbawa kung paano nangyayari ang pagbubukod na ito.
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);
			}
		}
	}
}

Output

Exception sa thread na "main" java.util.ConcurrentModificationException sa java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042) sa java.base/java.util.ArrayList$Itr.next(ArrayList.java :996) sa milestone.thirty.seven.ConcurrentModificationExceptionTestDriver1.main(ConcurrentModificationExceptionTestDriver1.java:22)

Paano Iwasan ang ConcurrentModificationException sa Java?

Mayroong iba't ibang mga workaround para sa ConcurrentModificationException . Narito ang iilan na nakatala. Maaari kang pumili ng sinuman ayon sa iyong mga pangangailangan.
  1. Iwasan ang pagbabago habang umuulit.
  2. Gumamit ng tradisyonal na mga loop para sa sabay-sabay na pag-ulit at pagbabago.
  3. Gumawa ng kopya ng mga value na babaguhin habang gumagamit ng mga iterator. I-update ang mga halaga kapag tapos na ang pag-ulit.

Halimbawa

Narito ang isang halimbawa kung paano mo maiiwasan ang 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);
	}
}

Output

Mga Paunang Araw ng Negosyo: [Lunes, Martes, Miyerkules, Huwebes, Biyernes, Sabado, Linggo] Mga Huling Araw ng Negosyo: [Lunes, Martes, Miyerkules, Huwebes, Biyernes]

Konklusyon

Iyon ay isang mabilis na dosis ng pagharap sa ConcurrentModificationException sa Java. Huwag mag-atubiling sumakay sa tuwing nakakaramdam ka ng suplado. Gaya ng dati, ang susi sa pagsulong ay pagsasanay at pasensya. Hanggang doon, patuloy na matuto at patuloy na lumago.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION