Подтвердить что ты не робот

Guava-libraries: isterators.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);
    }  
}  

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

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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