Scala 死锁与并行集合

标签 scala deadlock

为什么以下代码会造成死锁:

object Test extends Application
{
  def printProgress(i:Int) =
  {
    println("Processed " + i)
  }

  println("A")
  (1 to 1000).par.foreach{ i =>  
    printProgress(i)
  }   
  println("B")
}

(即 A 被打印,但 B 和任何 Processed ... 行都不会被打印。)

但是以下代码不会导致死锁:
object Test extends Application
{
  println("A")
  (1 to 1000).par.foreach{ i =>  
    println("Processed " + i)
  }   
  println("B")
}

(即一切都被打印出来。)

我正在运行 Scala 版本 2.9.1.final。

最佳答案

可能是因为您扩展了 Application,而我不知道您的两个示例之间有何不同。

使用 Application,代码在方法之外执行 main , 在类初始化中。 JVM 在这一点上受到严重限制,特别是与多线程相关。不推荐使用应用程序,而支持应用程序,它具有一些魔法(特性 DelayedInit),导致代码在 main 中执行.所以object Test extends App应该修复它。

关于Scala 死锁与并行集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8005503/

相关文章:

scala - Chisel 既不为 verilog 也不为 C++ 合成

scala - 为什么我在游戏 2 中得到 `Configuration error[Missing application.secret]`?

sql - 同时执行更新时出现死锁

ios - 为什么 concurrentQueue.sync 不会导致死锁

scala - 不一致的空相等检查 scala 2.11.7

Scala Play 框架初学者 - 'Action Not Found'

mysql - 在 scala 中使用 sqlContext.sql 进行子查询

.net - 如何在windbg中找到我的ReaderWriterLock的锁持有者(读者)

java - 我如何修改我的代码才能避免死锁?

plone - 解决 Plone 死锁问题的现代方法是什么?