gpt4 book ai didi

java - Java 8 流是原子的吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:04:59 24 4
gpt4 key购买 nike

我看了一些帖子,但是,我还是很困惑。

我知道并行流将以利用 CPU 的并行方式执行。我相信子作业将作为原子单元执行,对吗?

但是常规的 Java 8 流呢?

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

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

该行是否也会以线程安全/原子方式执行?

最佳答案

没有通用线程安全或原子性之类的东西。原子字段更新仅对于访问同一变量的线程是原子的,同步代码块对于仅在同一实例上同步的线程而言是原子/线程安全的。

流操作本身是一个纯粹的本地操作,这甚至适用于并行流操作,因为参与该操作的线程与任何其他线程无关。如果您使用具有(非局部)副作用的函数,这是非常不鼓励的,没有任何保证,没有增加线程安全性,也没有针对这些副作用的原子性。唯一的异常(exception)是终端操作 forEachforEachOrdered,它们旨在产生副作用,并且有关于多线程行为的详细记录。

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

关于java - Java 8 流是原子的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39879935/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com