CodeGym /Blogue Java /Random-PT /ConcurrentModificationException em Java
John Squirrels
Nível 41
San Francisco

ConcurrentModificationException em Java

Publicado no grupo Random-PT

O que é ConcurrentModificationException em Java?

“A ConcurrentModificationException ocorre quando um recurso é modificado sem ter os privilégios de modificação.”
Em outras palavras, o Java ConcurrentModificationException (como o nome sugere) ocorre devido ao problema de simultaneidade. Presume-se que você tenha conhecimento prévio de threads e multithreading antes de continuar. Algumas classes em Java, como as classes Collection, não permitem que um thread modifique um elemento enquanto outro thread está iterando sobre ele. Se a operação de modificação (adicionar, remover etc.) for executada, o programa lança ConcurrentModificationException . Este não é o único caso em que esta exceção ocorre. No entanto, aprofundar-se sairá do escopo deste artigo.

Exemplo

Vejamos um exemplo de como essa exceção ocorre.

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);
			}
		}
	}
}

Saída

Exceção no thread "main" java.util.ConcurrentModificationException em java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042) em java.base/java.util.ArrayList$Itr.next(ArrayList.java :996) em marco.thirty.seven.ConcurrentModificationExceptionTestDriver1.main(ConcurrentModificationExceptionTestDriver1.java:22)

Como evitar ConcurrentModificationException em Java?

Existem diferentes soluções alternativas para ConcurrentModificationException . Aqui estão alguns alistados. Você pode optar por qualquer pessoa de acordo com suas necessidades.
  1. Evite modificações durante a iteração.
  2. Use loops tradicionais para iteração e modificação simultâneas.
  3. Crie uma cópia dos valores a serem modificados ao usar iteradores. Atualize os valores quando a iteração terminar.

Exemplo

Aqui está um exemplo de como você pode evitar 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);
	}
}

Saída

Dias úteis iniciais: [segunda, terça, quarta, quinta, sexta, sábado, domingo] Dias úteis finais: [segunda, terça, quarta, quinta, sexta]

Conclusão

Essa foi uma dose rápida de como lidar com ConcurrentModificationException em Java. Sinta-se à vontade para embarcar sempre que se sentir preso. Como sempre, a chave para seguir em frente é prática e paciência. Até então, continue aprendendo e crescendo.
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION