【问题标题】:guava-libraries: is Iterators.cycle() thread-safe?番石榴库:Iterators.cycle() 线程安全吗?
【发布时间】:2010-12-20 20:30:41
【问题描述】:

假设我有以下课程:

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。循环迭代器的线程安全是否取决于具体的可迭代实现?

【问题讨论】:

    标签: java iterator thread-safety guava


    【解决方案1】:

    Guava 中几乎没有任何东西可以保证是线程安全的,除非有这样的记录。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-16
        • 2012-06-04
        • 1970-01-01
        • 2013-06-02
        • 1970-01-01
        相关资源
        最近更新 更多