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