2010-12-20 12 views
10

Supongamos que tengo la clase siguiente:guava-libraries: ¿es Iterators.cycle() seguro para subprocesos?

public class Foo { 

    private List<Integer> list = Lists.newArrayList(1, 2, 3, 4, 5); 
    private Iterator<Integer> iterator = Iterators.cycle(list); 

    public void bar(){ 
     Integer value = iterator.next(); 
     doSomethingWithAnInteger(value); 
    } 
} 

Si una instancia de Foo se acessed simultáneamente por dos hilos, necesito que cada hilo obtiene un valor diferente de iterator.next(). ¿El método bar() debe sincronizarse? ¿O está garantizado que iterator.next() es seguro para subprocesos?

En este ejemplo, estoy usando una ArrayList como Iterable subyacente. ¿La seguridad de subprocesos del iterador cíclico depende de la implementación iterable específica?

Gracias.

Respuesta

11

Casi nada en Guava está garantizado para ser seguro a menos que esté documentado como tal.

No tiene que sincronizar todo el método de compás, pero debe envolver la llamada a iterator.next() en un bloque sincronizado. por ejemplo:

public void bar(){ 
    Integer value; 
    synchronized (iterator) { 
     value = iterator.next(); 
    } 
    doSomethingWithAnInteger(value); 
} 
6

Tome un vistazo a la source code de Iterators.cycle(final Iterable<T> iterable). Incluso si el iterador subyacente es seguro para subprocesos, no se parece a la envoltura cíclica. Esto es consistente con la política de Java de no sincronizar implícitamente iteradores.

Cuestiones relacionadas