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. Сохраняет ли безопасность потока циклического итератора конкретную итерационную реализацию?
Спасибо.
Ответы
Ответ 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, неявно синхронизирующей итераторы.