2017-01-24 226 views
0

我正在開發一個Web應用程序,我需要爲每個請求生成一個隨機數。該請求將從一組桶中擊中特定的桶。爲給定的桶生成的隨機數應該具有均勻的分佈。我打算使用地圖,具有對桶ID的SplittableRandom情況下,像這樣是SplittableRandom.split()線程安全嗎?

buketId - > SplittableRandom

招待網絡要求,我先檢查請求中指定的bucketId。然後我選擇相應的SplittableRandom實例並調用split()。在重負載下,split()方法將由多個線程在同一個實例上調用。這種方法是否安全?

+1

否。在本地創建新實例或使用常規的「隨機」。 – shmosel

回答

3

根據JavaDoc SplittableRandom的

實例是線程安全的。他們是 被設計爲跨線程分裂,不共享。例如,使用隨機數的分叉/加入樣式計算 可能包括形式爲 new Subtask(aSplittableRandom.split()).fork()的構造。

split()方法返回基於thisSplittableRandom一個新的實例。

public SplittableRandom split() { 
    return new SplittableRandom(nextLong(), mixGamma(nextSeed())); 
} 

mixGamma()該方法是線程安全的,但由於它們修改非易失性long seed而沒有任何同步機制調用nextSeed()(均在split()nextLong())都沒有,。

+1

爲什麼你總結'split()'是線程安全的? – shmosel

+1

@shmosel你是對的,它不是(當你下到'nextSeed()')。 – Kayaman