我有一个List
个对象正在从几个线程中定期更新。在更新时,我想使用流来过滤掉一些元素。
例如;说我有定期更新的清单:
List<MyObject> myList
现在在某个时间点我在该列表上使用流
List<MyObject> result =
myList.stream().filter(myobj->myobjt.isValid()).collect(toList());
鉴于我的列表是从几个线程更新的,这是否是线程安全的?
答案 0 :(得分:7)
Javadoc of CopyOnWriteArrayList声明如下:
“snapshot”样式迭代器方法在创建迭代器时使用对数组状态的引用。这个数组在迭代器的生命周期中永远不会改变,所以干扰是不可能的,并且保证迭代器不会抛出ConcurrentModificationException。自迭代器创建以来,迭代器不会反映列表的添加,删除或更改。
所以,是的,你的代码应该是线程安全的。该流将在启动后忽略列表中的所有添加内容。