番石榴库:Iterators.cycle() 线程安全吗?

Posted

技术标签:

【中文标题】番石榴库:Iterators.cycle() 线程安全吗?【英文标题】:guava-libraries: is Iterators.cycle() thread-safe? 【发布时间】: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。循环迭代器的线程安全是否取决于具体的可迭代实现?

【问题讨论】:

【参考方案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 不隐式同步迭代器的策略是一致的。

【讨论】:

以上是关于番石榴库:Iterators.cycle() 线程安全吗?的主要内容,如果未能解决你的问题,请参考以下文章

番石榴的英文名称是啥

番石榴英语怎么读

番石榴的英语怎么说

为啥我们在 selenium webdriver 中需要番石榴?

石榴用英语怎么说?

石榴用英语怎么说?