假设我有以下类:
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.循环迭代器的线程安全性是否取决于具体的可迭代实现?
谢谢.
解决方法
Guava中几乎没有任何东西保证线程安全,除非这样记录.
您不必同步整个条形法,但您应该将该调用包装到同步块中的iterator.next()中.例如:
public void bar(){
Integer value;
synchronized (iterator) {
value = iterator.next();
}
doSomethingWithAnInteger(value);
}