我在大型分佈式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的人可能會指導提出問題的人如何將其放入隨機分佈中,如果甚至可能的話。我真的不知道那個圖書館的事情,所以我無法幫助那裏... –