流和并行流

2023-11-26

我有一个这样的测试代码:

List<Integer> list = new ArrayList<>(1000000);

for(int i=0;i<1000000;i++){
    list.add(i);
}

List<String> values = new ArrayList<>(1000000);

list.stream().forEach(
    i->values.add(new Date().toString())
);

System.out.println(values.size()); 

运行这个,我得到了正确的输出:1000000。

但是,如果我改变stream() to parallelStream(),如下所示:

 list.parallelStream().forEach(
    i->values.add(new Date().toString())
 );

我得到一个随机输出,例如:920821。

怎么了?


An ArrayList不同步。尝试同时向其中添加元素未定义。从forEach:

对于并行流管道,此操作不能保证尊重流的相遇顺序,因为这样做会牺牲并行性的好处。对于任何给定的元素,可以在库选择的任何时间和任何线程中执行该操作.

在你的第二个例子中,你最终会得到多个线程调用add同时在数组列表上并且ArrayList文档说:

请注意,此实现不是同步的。如果多个线程同时访问ArrayList实例,并且至少有一个线程在结构上修改了列表,则必须进行外部同步。

错误的解决方案

如果您改变使用ArrayList to a Vector,您将得到正确的结果,因为此列表实现是同步的。它的 Javadoc 说:

与新的集合实现不同,Vector已同步。

然而,不要使用它!此外,由于显式同步,它最终可能会变慢。

正确的做法

Stream API 明确地避免了这种情况,提供了可变还原范例,使用collect方法。下列

List<String> values = list.stream().map(i -> "foo").collect(Collectors.toList());

无论是否并行运行,都将始终提供正确的结果。 Stream 管道在内部处理并发性和保证在并行流的收集操作中使用非并发收集器是安全的. Collectors.toList()是一个内置收集器,将 Stream 的元素累积到列表中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

流和并行流 的相关文章

随机推荐

  • Maven 包含另一个用于插件配置的 pom

    有没有办法在 Maven pom 中包含另一个 pom 或信息 我有几个基本上不相关或有不同父 pom 的 pom 然而 对于打包来说 需要有一个与所有项目相同的清单 所以目前我有一个 pom
  • 比较 PHP 的 __get() 与 Python 中的 __get__() 和 __getattr__()

    有什么区别 get and getattr 在Python中 我来自 PHP 背景 那里只有 get 我什么时候应该使用哪个功能 我已经尝试解决这个问题有一段时间了 我看到很多问题 比如this one 询问之间的区别 getattr an
  • 将线程与 asyncio 结合使用

    我正在寻找一种方法来生成不同的线程 在我的实际程序中 线程数在执行过程中可以改变 来执行无限运行的操作 这会在运行期间阻塞我的整个应用程序 最坏的情况是 几秒钟 因此 我使用标准线程类并且asyncio 因为我的程序的其他部分正在使用它 这
  • 如何在shell中从二进制文件打印浮点值?

    我有由双浮点 8 字节 或仅浮点 4 字节 值组成的二进制文件 该文件是通过以下方式生成的 python c from struct import pack nwith open file bin wb as f f write pack
  • 回调调用之间的时间间隔?

    我有一个主要使用 PyAudio 的实验室项目 为了进一步了解其工作方式 我做了一些测量 在本例中是回调之间的时间 使用回调模式 我计时了 得到了一个有趣的结果 256 块大小 44 1k fs 0 0099701 0 0000365 0
  • ImportError:动态模块未定义模块导出函数(PyInit_cv2)

    当我尝试在 IPython 中导入 cv2 时 出现此错误 ImportError 动态模块未定义模块导出函数 PyInit cv2 我有opencv 3 0 ubuntu 14 04 python 3 4 我在网上搜索但找不到任何答案 P
  • 关闭浏览器窗口之前的javascript确认对话框

    我需要在使用 javascript 或 PHP 关闭浏览器窗口之前显示一个确认对话框 当我点击浏览器的关闭按钮时 应该会出现确认框 否则 不应显示该对话框 Thanks 关闭浏览器时将显示它 window onbeforeunload fu
  • 使用触发器('reload')进行ajax调用后jqgrid不重新加载

    我正在尝试使用刚刚更改的新数据重新加载网格 以便用户可以看到经过修改的新数据 我的方法 jQuery relCasePick click function var ids jQuery list10 jqGrid getGridParam
  • Bean 属性“xxx”不可写或具有无效的 setter 方法

    我有春季网络应用程序 我已经定义了控制器 bean 它将服务 bean 作为属性 亦服务豆以道 Dao 经过测试并且工作正常 现在服务有问题 事实上我会确定那里的二传手 那么问题出在哪里呢 控制器豆
  • 带用户/密码的 Genymotion 代理

    我使用以下配置通过 Genymotion 运行 Android 对于仅主机 我使用 192 168 1 213 DHCP 分配以 192 168 1 214 开头的地址 我的计算机位于 Squid 代理后面 该代理具有用户名和密码 地址为
  • 如何在perl脚本退出之前运行一段代码

    在我的脚本中 我需要从磁盘文件加载一些信息 并且在脚本运行期间 信息可能会更改 为了保持磁盘中文件和内存副本中的文件的一致性 我需要 每当内存中的信息发生更改时 将信息写回磁盘或定期写入 返回到磁盘或在脚本退出时将它们写回 这是首选方法 因
  • 随机生成无重复数组

    我正在尝试创建一些生成没有重复值的随机数组的东西 我已经看过其他答案 但似乎没有一个可以帮助我理解 我想不出一种方法来实际生成不包含重复项的随机数 这是我到目前为止所尝试过的 srand time NULL int numbers 4 fo
  • 如何将数据插入 Laravel 数据库?

    我是编程新手 我在views register blade php中创建了一个基本表单 如下所示 section content h1 Registration Form h1 hr h3 Please insert the informa
  • EF4 更新实体而不首先获取实体

    如何更新实体而无需调用来选择它 如果我提供实体的密钥 它是否应该在 ObjectContext 上调用 SaveChanges 后不知道更新 我目前这样做 var user context Users Single u gt u Id 2
  • 在 R 中希伯来语编码 Hell 并在 Windows 中编写 UTF-8 表

    我正在尝试保存提取的数据RSelenium from https www magna isa gov il Det ails aspx l he 但是虽然 R 成功地将希伯来字符打印到控制台 但在导出 TXT CSV 或其他简单的 R 函数
  • C:inline 关键字值得吗?

    是否值得使用 inline 关键字 或者编译器足够聪明 知道何时需要内联函数 是的 它足够聪明 但在过去 40 年里 C 程序的构建方式却毫无进展 它仍然一次一个源代码文件 因此 要在多个 c 文件中内联一个函数 请将函数定义放入 h 文件
  • 将元素从地图移动到另一个地图的有效方法

    我必须找到一个有效的解决方案来解决这个问题 我有两张地图 我必须将一些元素从map1移动到map2 即从map1删除并放入map2 我有一些键 通过它们我可以找到 map1 中的元素 即我现在正在做的事情 bool temp temp ma
  • 使 php 包含子目录中的工作

    好的 我正在为我的自定义博客创建一个管理界面 网址为 admin 我是否可以使用相同的包含 包括自动加载 作为根目录 如果可能的话 我还希望能够自动更正导航中的链接 以便在从 admin 访问时将 中的 index php 更改为 inde
  • 在 Windows 窗体应用程序中实现键盘快捷键的最佳方式?

    I m looking for a best way to implement common Windows keyboard shortcuts for example Ctrl F Ctrl N in my Windows Forms
  • 流和并行流

    我有一个这样的测试代码 List