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()然后在流上执行某些操作,如过滤器等,如果我还必须将列表放入同步块中,或者流是否制作了列表的副本?
谢谢
流操作在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)
| 归档时间: |
|
| 查看次数: |
990 次 |
| 最近记录: |