¿Por qué ArrayList no lanza ConcurrentModificationException cuando se modifica desde varios subprocesos?

ConcurrentModificationException: esta excepción puede ser lanzada por métodos que han detectado una modificación concurrente de un objeto cuando dicha modificación no es permisible.

Arriba está la definición de ConcurrentModificationException de javadoc.

Así que trato de probar el siguiente código:

final List<String> tickets = new ArrayList<String>(100000);
for (int i = 0; i < 100000; i++) {
    tickets.add("ticket NO," + i);
}
for (int i = 0; i < 10; i++) {
    Thread salethread = new Thread() {
        public void run() {
            while (tickets.size() > 0) {
                tickets.remove(0);
                System.out.println(Thread.currentThread().getId()+"Remove 0");
            }
        }
    };
    salethread.start();
}

El código es simple. 10 hilos eliminan el elemento del objeto arraylist. Es seguro que múltiples hilos acceden a un objeto. Pero funciona bien. No se lanza ninguna excepción. ¿Por qué?

Respuestas a la pregunta(5)

Su respuesta a la pregunta