Iterando através de uma Coleção, evitando ConcurrentModificationException ao remover objetos em um loop

Todos sabemos que você não pode fazer isso:

for (Object i : l) {
    if (condition(i)) {
        l.remove(i);
    }
}

ConcurrentModificationException etc ... isso aparentemente funciona às vezes, mas nem sempre. Aqui está um código específico:

public static void main(String[] args) {
    Collection<Integer> l = new ArrayList<>();

    for (int i = 0; i < 10; ++i) {
        l.add(4);
        l.add(5);
        l.add(6);
    }

    for (int i : l) {
        if (i == 5) {
            l.remove(i);
        }
    }

    System.out.println(l);
}

Obviamente, isso resulta em:

Exception in thread "main" java.util.ConcurrentModificationException

... mesmo que vários threads não estejam fazendo isso ... Enfim.

Qual é a melhor solução para esse problema? Como posso remover um item da coleção em um loop sem lançar essa exceção?

Eu também estou usando um arbitrárioCollection aqui, não necessariamente umArrayList, então você não pode confiarget.

questionAnswers(20)

yourAnswerToTheQuestion