来自修改集合的Java 8流

use*_*534 3 java multithreading java-8 java-stream

假设我有一个List只被一个线程修改的对象(线程可以添加或删除对象),而另一个线程偶尔使用上面集合中的流api对它进行一些流操作,最后(急切操作)返回一个新的集合.这是一个线程安全的场景吗?毕竟只有一个线程更新了集合.

Tag*_*eev 6

这完全取决于您的源List实现.随着ArrayList可能会得到ConcurrentModificationException(或可能会得到损坏的数据或其他一些例外:见评论).有了CopyOnWriteArrayList你可以放心地使用流操作:他们将看到创建的流时,这是实际的列表的状态.在任何情况下,您都应该检查文档中spliterator()相应集合的方法,以确定在并发环境中使用它是否安全.

  • 你*可能*得到一个`ConcurrentModificationException`,因为它将被抛出一个*尽力而为*的基础.您*可能*默默地获取损坏的数据.或者是一个不同的异常,它不会告诉你它是由并发操作引起的,例如`IndexOutOfBoundsException`.在虚假问题突然发生之前,你*可能会在很长一段时间内使用破损的代码逃脱...... (6认同)