我是否必须在流读取的列表上进行同步?

Ann*_*ein 7 java java-8 java-stream

如果我有一个线程敏感列表,我通常会这样迭代它:

    List list = Collections.synchronizedList(new ArrayList());
...
synchronized(list) {
    Iterator i = list.iterator(); // Must be in synchronized block
    while (i.hasNext())
        foo(i.next());   
}
Run Code Online (Sandbox Code Playgroud)

我想知道我是否使用list.stream()然后在流上执行某些操作,如过滤器等,如果我还必须将列表放入同步块中,或者流是否制作了列表的副本?

谢谢

Rom*_*kiy 7

流操作在spliterator()内部使用方法.

以下是spliterator()方法ArrayList:

    public Spliterator<E> spliterator() {
        checkForComodification();
        return new ArrayListSpliterator<E>(ArrayList.this, offset,
                                           offset + this.size, this.modCount);
    }
Run Code Online (Sandbox Code Playgroud)

它检查编码,因此看起来stream()操作必须在您的情况下在同步块内.

此外,spliterator()SynchronizedCollection(中Collections)有评论

    public Spliterator<E> spliterator() {
        return c.spliterator(); // Must be manually synched by user!
    }
Run Code Online (Sandbox Code Playgroud)

这与以下评论类似iterator():

    public Iterator<E> iterator() {
        return c.iterator(); // Must be manually synched by user!
    }
Run Code Online (Sandbox Code Playgroud)

这显示了相同的:围绕stream()操作需要同步(至少,如果iterator()需要这样的同步).

最有说服力的stream()方法SynchronizedCollection:来自:

    public Stream<E> stream() {
        return c.stream(); // Must be manually synched by user!
    }
Run Code Online (Sandbox Code Playgroud)