ThreadLocalRandom的使用

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

相關文章
相關標籤/搜索