【发布时间】:2014-01-07 10:30:36
【问题描述】:
我在大型分布式 Scala 和 Akka 应用程序中使用 org.apache.commons.math3.distribution.NormalDistribution。在调试过程中,我发现sample() 偶尔会返回 NaN,它会默默传播并导致线程挂在 org.apache.commons.math3.ode.nonstiff.DormandPrince853Integrator
NaN 可以通过并行集合简单地复制(不会发生在顺序代码中):
val normal = new NormalDistribution(0,0.1)
(1 to 1000000000).par.foreach{i =>
val r = normal.sample
if(r.isNaN()) throw new Exception("r = "+r)
}
显然,将val normal 移动到foreach 中可以解决这种情况下的问题。
我查看了docs,但没有看到任何警告我此类问题的信息。我是否未能掌握有关线程安全的更基本概念?不用说我现在正在检查 NaN。
【问题讨论】:
标签: java multithreading scala concurrency apache-commons-math