ThreadLocalRandom繼承了Random接口,而且實現了Serializable接口,就已經知道了它的真身!java
由於Random的實現因爲原子變量的更新是 CAS 操做,同時只有一個線程會成功,因此會形成大量線程進行自旋重試,這是會下降併發性能的,因此 ThreadLocalRandom 應運而生。併發
在併發程序中使用ThreadLocalRandom而不是共享Random對象一般會更少的開銷和爭用。當多個任務(例如,每一個ForkJoinTask)在線程池中並行使用隨機數時,使用ThreadLocalRandom是特別合適的。dom
ThreadLocalRandom在java.util.concurrent包下,是一個與當前線程隔離的隨機數生成器。性能
類的用法一般應爲如下形式:ThreadLocalRandom.current().nextX(...)(其中X爲Int,Long等)。當全部用法都是這種形式時,永遠不可能在多個線程中意外地共享ThreadLocalRandom。線程
該類還提供了其餘經常使用的有界隨機生成方法。orm
經過current方法ThreadLocalRandom實例,會先調用localInit方法初始化一些參數:對象
實現上的細節比較多,不是很明白,先來看看怎麼用的吧blog
輸出:繼承
nextInt():返回僞隨機int值接口
這裏的int mix32(long z)
數據的來源是 final long nextSeed() 是方法創造的
相應的還有其餘基礎數據類型的隨機方法
其中看着名稱比較特別的是nextGaussian(),註釋寫着:返回下一個僞隨機,高斯(「normally」)分佈(正太)的雙值,其平均值爲0.0,標準誤差爲1.0,該隨機數生成器的序列。你看懂了嗎?我沒懂。
與Random類同樣,咱們也可使用doubles(),ints()和longs()方法生成隨機值流。
輸出:
源碼的實現以下面
固然還有相似的其餘方法
先用Ramdon試試, end time:131
而後用用ThreadLocalRandom,end time:133