我在大型分布式Scala & Akka应用程序中使用org.apache.commons.math3.distribution.NormalDistribution
。在调试过程中,我发现sample()
偶尔返回NaN的,这默默传播,造成线程挂起org.apache.commons.math3.ode.nonstiff.DormandPrince853Integrator
线程安全警告
楠可以简单地用平行colelctions复制(串行代码不会发生):
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)
}
显然在foreach
内移动val normal
解决了这种情况下的问题。
我看过docs,但看不到任何警告我这类问题。我没有把握关于线程安全的更基本概念吗?不用说我现在正在检查NaN。
请注意,古老的'java.util.Random'既是线程安全的也是无锁的... –
@MichaelBorgwardt真的,很好!知道apache.commons.math的人可能会指导提出问题的人如何将其放入随机分布中,如果甚至可能的话。我真的不知道那个图书馆的事情,所以我无法帮助那里... –