Java 8流是primefaces的吗?

我读了几篇文章,然而,我仍然感到困惑。

我知道并行流将以并行方式执行,这将利用CPU。 我认为子作业将作为primefaces单位执行,我是否正确?

但是常规的Java 8流呢?

如果我执行让我们说下一行代码:

users.stream().map(user->user.getUsername()).collect(Collectors.toList()); 

该行是否也将以线程安全/primefaces方式执行?

没有通用线程安全性或primefaces性这样的东西。 对于访问相同变量的线程,primefaces字段更新仅是primefaces的,对于仅在同一实例上同步的线程, synchronized代码块是primefaces/线程安全的。

流操作本身就是纯粹的本地操作,即使对于并行流操作也是如此,因为参与该操作的线程与任何其他线程无关。 如果您使用具有(非本地)副作用的函数,这是非常不鼓励的,则无法保证,这些副作用没有增加的线程安全性或primefaces性。 唯一的例外是forEachforEachOrdered的终端操作,它们用于产生副作用,并且有关multithreading行为的详细记录。

所以操作users.stream().map(user->user.getUsername()).collect(Collectors.toList()) ,假设方法getUsername()遵循契约并且没有副作用,对于任何其他线程。 如果以线程安全的方式将返回的列表发布到其他线程,那么它将是安全的,如果你让它以不安全的方式逃脱,将无法保证。 如果您从未将结果发布到其他线程,则问题变得无关紧要。

一般没有。 如果使用的Spliterator具有CONCURRENT特性,则该流是线程安全的。

流API为管道的每个步骤定义了许多合同,如果它们中的任何一个被违反,则可能发生不可预测的行为或exception。

  • Spliterator 。 请注意后期绑定,IMMUTABLE和CONCURRENT属性,这些属性可能因各种来源而异。
  • 集合源通常指定其分裂器的性质,例如ConcurrentHashMap为其视图报告CONCURRENT,而HashMap则不。 这意味着hashmap无法处理外部线程的修改或流管道中的干扰副作用。
  • 管道中的每个操作都定义了用户提供的方法应具有的属性,关键概念是无干扰 ,有状态和副作用。 比较filter和窥视 。
  • 收集器 / 收集器没有明确说明它们的要求,但是提供的function通常应该是非干扰的,无副作用的和无状态的,就像中间操作一样,特别是当使用并发收集器时。

通常,如果您正确地执行所有操作,那么并行和顺序流都可以安全使用,即使在不支持并发修改的集合上也是如此。

如果您正在做违反这些要求的事情,那么顺序流可能会更宽容一些,但它们可能仍会失败。