假设我有以下课程:
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。循环迭代器的线程安全性是否依赖于特定的可迭代实现?
谢谢。
答案 0 :(得分:11)
除非另有说明,否则Guava中的任何内容都不会保证是线程安全的。
您不必同步整个bar方法,但是您应该在同步块中包含对iterator.next()的调用。例如:
public void bar(){
Integer value;
synchronized (iterator) {
value = iterator.next();
}
doSomethingWithAnInteger(value);
}
答案 1 :(得分:6)
查看Iterators.cycle(final Iterable<T> iterable)
的{{3}}。即使底层迭代器是线程安全的,它看起来也不像循环包装器。这与Java的不隐式同步迭代器的策略一致。