非并发数据结构源的流使用需要满足不干扰要求,这是否意味着我们不能在流管道执行期间更改数据结构中的元素状态(除了不能更改源数据结构本身)?(问题1)
在流包描述中关于非干扰的部分中,它说: "对于大多数数据源,防止干扰意味着确保数据源在流管道执行期间没有被修改。"
这段话没有提到修改元素状态吗?
例如,假设“形状”是非线程安全的集合(如ArrayList
),下面的代码是否被认为有干扰?(问题2)
shapes.stream()
.filter(s -> s.getColor() == BLUE)
.forEach(s -> s.setColor(RED));
这个例子是从一个可靠来源中提取的(至少如此说),因此应该是正确的。但是,如果我将
stream()
更改为parallelStream()
,它还会安全和正确吗? (问题3)另一方面,Naftalin Maurice的“掌握Lambdas”,另一个可靠的来源,明确表示通过管道操作更改元素的状态(值)确实是干扰。 从非干扰部分(3.2.3)可以看出:
“但是,流的规则禁止任何线程修改流源,例如更改元素的值,而不仅仅是管道操作。”
如果书中所说的是正确的,那么这是否意味着我们不能使用Stream API来修改元素的状态(使用
forEach
),而必须使用常规迭代器(或for-each或Iterable.forEach
)? (问题4)
ArrayList
本身不具备线程安全性并不意味着在并发场景下不能正确使用ArrayList
。关键是看它是如何被使用的... - Holger