来自修改集合的Java8流

来自修改集合的Java8流,java,multithreading,java-8,java-stream,Java,Multithreading,Java 8,Java Stream,假设我有一个对象的列表,这些对象只被一个线程修改(该线程可以添加或删除对象),另一个线程偶尔使用上述集合中的流api对其进行一些流操作,并在最后(急切操作)返回一个新集合。 这是线程安全的场景吗?毕竟,只有一个线程更新集合。您应该得到并发修改异常,因为您同时使用此集合进行读写。这完全取决于源代码列表的实现。您可能会得到(或者可能会得到损坏的数据或其他一些异常:请参阅注释)。使用,您可以安全地使用流操作:它们将看到创建流时实际的列表状态。无论如何,您应该检查相应集合的spliterator()方法

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

您应该得到并发修改异常,因为您同时使用此集合进行读写。

这完全取决于源代码列表的实现。您可能会得到(或者可能会得到损坏的数据或其他一些异常:请参阅注释)。使用,您可以安全地使用流操作:它们将看到创建流时实际的列表状态。无论如何,您应该检查相应集合的
spliterator()
方法的文档,看看在并发环境中使用它是否安全。

我不这么认为。。。如果一个线程删除一个项目,而另一个线程尝试读取该项目,会发生什么情况?但我可能错了,因为我不确定流在引擎盖下是如何工作的。这不是一个线程安全的场景,因为你有一个线程在写,一个或多个线程在读。为了保证线程安全,您需要确保写操作不会干扰读操作。如果集合允许并发修改,该怎么办?您可能会得到一个
ConcurrentModificationException
,因为它将以尽力而为的方式抛出。您可能会以静默方式获取损坏的数据。或者一个不同的异常,它不会告诉您它是由并发操作引起的,例如
IndexOutOfBoundsException
。在伪问题突然出现之前,您可能会在很长一段时间内不受损坏的代码的影响…