guava-libraries:Iterators.cycle()线程安全吗?

Ota*_*edo 11 java iterator thread-safety guava

假设我有以下课程:

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);
    }  
}  
Run Code Online (Sandbox Code Playgroud)

如果一个Foo实例被两个线程同时访问,我需要每个线程从中获取不同的值iterator.next().该bar()方法是否必须同步?或者iterator.next()保证是线程安全的?

在这个例子中,我使用ArrayList作为底层的Iterable.循环迭代器的线程安全性是否依赖于特定的可迭代实现?

谢谢.

Lau*_*ves 11

除非另有说明,否则Guava中几乎没有任何东西可以保证是线程安全的.

您不必同步整个bar方法,但是应该在同步块中包含对iterator.next()的调用.例如:

public void bar(){  
    Integer value;
    synchronized (iterator) {
        value = iterator.next();  
    }
    doSomethingWithAnInteger(value);
}  
Run Code Online (Sandbox Code Playgroud)


Adr*_*scu 6

看看的源代码Iterators.cycle(final Iterable<T> iterable).即使底层迭代器是线程安全的,它看起来也不像循环包装器.这与Java不隐式同步迭代器的策略一致.