在外部修改并发集合时,流式传输是否安全?

时间:2018-06-08 07:17:37

标签: java multithreading concurrency java-8 java-stream

我有一个ConcurrentLinkedQueue被多个线程访问过;其中的对象是不可变的。在一个帖子中,我需要一个数据快照,我通过在其上调用stream来做。安全吗?我知道non-interference的要求,但似乎是在谈论从其中一个流操作进行修改(" 流管道,其源可能不是并发的,不应该修改流& #39; s数据源"),不一定是外部的。此外,ConcurrentLinkedQueue是为并发访问而设计的,所以就是这样。

1 个答案:

答案 0 :(得分:9)

从您提供的链接中的文档

  

对于大多数数据源,防止干扰意味着确保   在执行流期间根本不修改数据源   管道。值得注意的例外是其来源的流   并发集合,专门设计用于处理   并发修改。并发流源是那些   Spliterator报告CONCURRENT特征

来自SplitIterator的文档(其CONCURRENT特征)

  

static final int CONCURRENT

     

表示元素源可能安全的特征值   同时修改(允许添加,替换和/或   删除)由多个线程没有外部同步。如果是这样,   预计Spliterator将有一份有关该文件的书面政策   遍历期间修改的影响。

这是来自Collection interface stream方法的实现(在ConcurrentLinkedQueue中未被覆盖)

$img_data = file_get_contents($img_path.$image_name.'0.jpg');
$size = getimagesizefromstring($img_data);

因此,只要ConcurrentLinkedQueue使用CONCURRENT SplitIterator(它确实如此),我认为您可以使用stream()安全地迭代ConcurrentLinkedQueue。