2010-12-20 9 views
10

Załóżmy, że mam następujące klasy:guava-libraries: czy wątek bezpieczny jest w Iterators.cycle()?

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

Jeśli wystąpienie Foo jest acessed jednocześnie przez dwóch wątków, muszę, że każdy wątek dostaje inną wartość od iterator.next(). Czy metoda bar() musi być zsynchronizowana? Czy jest gwarantowany bezpieczny wątek w postaci iterator.next()?

W tym przykładzie używam tablicy ArrayList jako podstawowej wersji Iterable. Czy bezpieczeństwo wątków cyklicznego iteratora zależy od konkretnej iteracyjnej implementacji?

Dziękuję.

Odpowiedz

11

Prawie nic na Guava nie jest gwarantowane, chyba że udokumentowane jako takie.

Nie musisz synchronizować całej metody paska, ale powinieneś zawinąć wywołanie do iterator.next() w zsynchronizowanym bloku. np:

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

Spójrz na source code z Iterators.cycle(final Iterable<T> iterable). Nawet jeśli podstawowy Iterator jest bezpieczny dla wątków, nie wygląda tak, jak opakowanie rowerowe. Jest to zgodne z polityką Java polegającą na tym, że nie jest to niejawna synchronizacja iteratorów.

Powiązane problemy