我org.apache.commons.math3.distribution.NormalDistribution
在一个大型分布式 Scala & Akka 应用程序中使用。在调试过程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
解决了这种情况下的问题。
我查看了文档,但看不到任何警告我此类问题的内容。我是否未能掌握有关线程安全的更基本概念?不用说我现在正在检查 NaN。