【问题标题】:Do parallel streams have their own copies of local variables?并行流是否有自己的局部变量副本?
【发布时间】:2020-03-01 11:31:04
【问题描述】:

我必须对包含数百万个项目的集合进行迭代,并且最多执行数百次。我看到并行流大大提高了性能。

我在 for 循环中的代码可以安全地自行运行,前提是它可以获取循环中声明的任何变量的自己的副本。

所以我的问题是,并行流中的循环是否会获得自己在循环中声明的变量副本?

【问题讨论】:

  • 我不太确定我是否理解您的问题。你有一个作为参数传递给parallelStream(...) 的 lambda。在 lambda 中,有一个循环。在循环中,您创建变量。这是正确的吗?
  • 贴出相关代码,以便我们更好地了解您的情况。

标签: java parallel-processing java-stream


【解决方案1】:

Lambda 只能在其主体内部使用“最终”或“有效最终”变量,这些变量在 lambda 主体外部声明。这意味着,这些变量在初始化后不能再更改。因此,线程是否“共享”相同的变量或使用它的副本并不重要。

【讨论】:

  • 需要注意的一点是,如果变量本身持有对可变数据结构的引用,那么任何线程都可以修改底层数据结构。例如地图或列表
  • 是的,当然。使用线程时总是会出现这个问题,它与 lambdas 无关。
  • 我们有一个正式的术语,effectively final。您应该使用它而不是“准决赛”。
猜你喜欢
  • 2022-06-23
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
  • 2011-09-15
  • 2019-08-26
  • 2019-03-18
  • 1970-01-01
相关资源
最近更新 更多