¿Por qué listIterator de SynchronizedList necesita sincronización externa por parte del usuario?

Consulte el siguiente código fuente de Java:

static class SynchronizedList<E>
extends SynchronizedCollection<E>
implements List<E> {

final List<E> list;

public boolean equals(Object o) {
    synchronized (mutex) {return list.equals(o);}
}
public int hashCode() {
    synchronized (mutex) {return list.hashCode();}
}

public ListIterator<E> listIterator() {
    return list.listIterator(); //Must be manually synched by user
}

Mi pregunta es ¿por qué listIterator() no está protegido por el mutex como con el método hashcode() y equals()? ¿Por qué lo diseñaron para que requiera sincronización externa por parte del usuario?

preguntado el 04 de julio de 12 a las 07:07

3 Respuestas

El uso principal de ListIterator no es obtenerlo, sino iterarlo para visitar elementos individuales en la lista. Esta es una operación con estado y la realiza completamente el cliente y no la clase. SynchronizedList. Por otro lado, los métodos equals() y hashCode() se calculan en su totalidad dentro del SynchronizedList y no requiere que el cliente haga mucho, espere tomar los valores devueltos. Sincronizando el método para obtener el iterador no es de mucha ayuda como señaló el usuario 1252434.

ListIterator es un ejemplo clásico del uso del bloqueo del lado del cliente como estrategia para garantizar la sincronización cuando la clase original no puede proporcionarlo.

Respondido 04 Jul 12, 09:07

Si sugieres:

public ListIterator<E> listIterator() {
    synchronized(mutex) { return list.listIterator(); }
}

Eso no ayudará mucho.

sincronizarías el creación del propio iterador, lo que podría ayudar con algunos problemas. Pero no sincronizarás el utilizan el del iterador. Todavía se pueden realizar cambios en la lista mientras mantiene presionado el iterador y, dependiendo de la implementación, incluso puede hacer que falle, porque la lista puede estar temporalmente en un estado interno no válido.

Respondido 04 Jul 12, 09:07

Podría haber dos posibles razones.

Tenemos tres implementaciones diferentes de List interfaz . Uno es Vector y otros dos son ArrayList y LinkedList.

Una de las razones es si estamos tratando con Vectors entonces desafiante no synchronization se requiere en Vector porque ya es seguro para subprocesos, pero si estamos usando ArrayList y LinkedList entonces necesitamos sincronizar estas Listas

Otra razón es que podemos usar SynchronizedList clase en Single-Threaded Solicitud si hubieran hecho listIterator() as Synchronized entonces este es un rendimiento afectado por thread-safety incluso en single-threaded ambiente.

Respondido 04 Jul 12, 08:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.