2010-12-20 5 views
10

nehme ich die folgende Klasse haben:Guava-Bibliotheken: ist Iterators.cycle() Thread-sicher?

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

Wenn eine Instanz von Foo gleichzeitig von zwei Threads acessed ist, ich brauche, dass jeder Faden von iterator.next() einen anderen Wert erhält. Muss die bar() Methode synchronisiert werden? Oder ist iterator.next() garantiert fadensicher?

In diesem Beispiel verwende ich eine ArrayList als das zugrunde liegende Iterable. Ist die Thread-Sicherheit des zyklischen Iterators von der spezifischen iterierbaren Implementierung abhängig?

Vielen Dank.

Antwort

11

So gut wie nichts in Guava ist garantiert threadsicher, es sei denn als solches dokumentiert.

Sie müssen nicht die gesamte Balkenmethode synchronisieren, aber Sie sollten den Aufruf in einem synchronisierten Block an iterator.next() übergeben. zB:

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

Werfen Sie einen Blick auf die source code von Iterators.cycle(final Iterable<T> iterable). Auch wenn der zugrunde liegende Iterator threadsicher ist, sieht er nicht so aus wie der zyklische Wrapper. Dies entspricht der Java-Richtlinie, Iteratoren nicht implizit zu synchronisieren.