библиотеки guava: является ли Iterators.cycle () поточно-ориентированным? - PullRequest
10 голосов
/ 20 декабря 2010

Предположим, у меня есть следующий класс:

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

Если к экземпляру Foo одновременно обращаются два потока, мне нужно, чтобы каждый поток получил различное значение от iterator.next().Нужно ли синхронизировать метод bar()?Или iterator.next() гарантированно безопасен для потоков?

В этом примере я использую ArrayList в качестве базового Iterable.Зависит ли потокобезопасность циклического итератора от конкретной итерируемой реализации?

Спасибо.

Ответы [ 2 ]

11 голосов
/ 20 декабря 2010

Почти ничего в Guava не гарантированно безопасен для потоков, если не указано иное.

Вам не нужно синхронизировать весь метод bar, но вы должны заключить вызов iterator.next () в синхронизированный блок. например:

public void bar(){  
    Integer value;
    synchronized (iterator) {
        value = iterator.next();  
    }
    doSomethingWithAnInteger(value);
}  
6 голосов
/ 20 декабря 2010

Взгляните на исходный код из Iterators.cycle(final Iterable<T> iterable).Даже если нижележащий итератор является поточно-ориентированным, он не похож на циклическую оболочку.Это согласуется с политикой Java по неявной синхронизации итераторов.

...