成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java中生成隨機數Random VS ThreadLocalRandom性能比較

開發 前端
本文講解了JDK中提供的兩種生成隨機數的方式,一個是JDK 1.0引入的Random?類,另外一個是JDK1.7引入的ThreadLocalRandom?類,由于底層的實現機制不同,ThreadLocalRandom?的性能是遠高于Random?,建議后面大家在技術選型的時候優先使用ThreadLocalRandom。

?前言

大家項目中如果有生成隨機數的需求,我想大多都會選擇使用Random來實現,它內部使用了CAS來實現。實際上,JDK1.7之后,提供了另外一個生成隨機數的類ThreadLocalRandom,那么他們二者之間的性能是怎么樣的呢?

Random的使用

Random類是JDK提供的生成隨機數的類, 這個類不是隨機的,而是偽隨機的。什么是偽隨機呢?偽隨機是指生成的隨機數是有一定規律的,這個規律出現的周期因偽隨機算法的優劣而異。一般來說,周期比較長,但可以預見。我們可以通過以下代碼簡單地使用 Random:

圖片

Random中有很多方法。這里我們就分析比較常見的nextInt()和nextInt(int bound)方法。

  • nextInt()會計算int范圍內的隨機數,
  • nextInt(int bound)會計算[0,bound) 之間的隨機數,左閉右開。

實現原理

Random類的構造函數如下圖所示:

圖片

可以看到在構造方法中,根據當前時間seed生成了一個AtomicLong類型的seed。
public int nextInt() {
return next(32);
}

這里面直接調用了next()方法,傳入了32,這里的32是指Int的位數。

protected int next(int bits) {
long oldseed, nextseed;
AtomicLong seed = this.seed;
do {
oldseed = seed.get();
nextseed = (oldseed * multiplier + addend) & mask;
} while (!seed.compareAndSet(oldseed, nextseed));
return (int)(nextseed >>> (48 - bits));
}

這里會根據seed的當前值,通過一定的規則(偽隨機)計算出下一個seed,然后進行CAS。如果CAS失敗,繼續循環上述操作。最后根據我們需要的位數返回。

小結:可以看出在next(int bits)?方法中,對AtomicLong進行了CAS操作,如果失敗則循環重試。很多人一看到CAS,因為不需要加鎖,第一時間就想到了高性能、高并發。但是在這里,卻成為了我們多線程并發性能的瓶頸。可以想象,當我們有多個線程執行CAS時,只有一個線程一定會失敗,其他的會繼續循環執行CAS操作。當并發線程較多時,性能就會下降。

ThreadLocalRandom的使用

JDK1.7之后,提供了一個新類ThreadLocalRandom?來替代Random。

圖片

實現原理

我們先來看下current()方法。

public static ThreadLocalRandom current() {
if (UNSAFE.getInt(Thread.currentThread(), PROBE) == 0)
localInit();
return instance;
}
static final void localInit() {
int p = probeGenerator.addAndGet(PROBE_INCREMENT);
int probe = (p == 0) ? 1 : p; // skip 0
long seed = mix64(seeder.getAndAdd(SEEDER_INCREMENT));
Thread t = Thread.currentThread();
UNSAFE.putLong(t, SEED, seed);
UNSAFE.putInt(t, PROBE, probe);
}

如果沒有初始化,先進行初始化,這里我們的seed不再是全局變量了。我們的線程中有三個變量:

/** The current seed for a ThreadLocalRandom */
@sun.misc.Contended("tlr")
long threadLocalRandomSeed;

/** Probe hash value; nonzero if threadLocalRandomSeed initialized */
@sun.misc.Contended("tlr")
int threadLocalRandomProbe;

/** Secondary seed isolated from public ThreadLocalRandom sequence */
@sun.misc.Contended("tlr")
int threadLocalRandomSecondarySeed;
  • threadLocalRandomSeed:這是我們用來控制隨機數的種子。
  • threadLocalRandomProbe:這個就是ThreadLocalRandom,用來控制初始化。
  • threadLocalRandomSecondarySeed:這是二級種子。

關鍵代碼如下:

UNSAFE.putLong(t = Thread.currentThread(), SEED,r=UNSAFE.getLong(t, SEED) + GAMMA);

可以看出,由于每個線程都維護自己的seed?,所以此時不需要CAS?,直接進行put。這里通過線程間的隔離來減少并發沖突,所以ThreadLocalRandom的性能非常高。

性能對比

通過基準工具JMH測試:

@BenchmarkMode({Mode.AverageTime})
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iteratinotallow=3, time = 5, timeUnit = TimeUnit.SECONDS)
@Measurement(iteratinotallow=3,time = 5)
@Threads(4)
@Fork(1)
@State(Scope.Benchmark)
public class Myclass {
Random random = new Random();
ThreadLocalRandom threadLocalRandom = ThreadLocalRandom.current();

@Benchmark
public int measureRandom(){
return random.nextInt();
}
@Benchmark
public int threadLocalmeasureRandom(){
return threadLocalRandom.nextInt();
}

}

運行結果如下圖所示,最左邊是并發線程的數量:

圖片

圖片

顯而易見,無論線程數量是多少,ThreadLocalRandom?性能是遠高于Random。

總結

本文講解了JDK中提供的兩種生成隨機數的方式,一個是JDK 1.0引入的Random?類,另外一個是JDK1.7引入的ThreadLocalRandom?類,由于底層的實現機制不同,ThreadLocalRandom?的性能是遠高于Random?,建議后面大家在技術選型的時候優先使用ThreadLocalRandom。

責任編輯:武曉燕 來源: JAVA旭陽
相關推薦

2024-06-24 07:00:00

C++RustGo

2024-05-15 09:09:49

2023-11-19 21:17:58

GoRust

2021-04-06 08:54:13

Random線程安全數生成器

2024-11-01 15:51:06

2011-04-15 10:26:38

JavaMVC

2009-12-02 17:01:01

PHP隨機數rand()

2019-09-11 10:09:00

Java虛擬機算法

2019-05-24 08:48:33

JSONJacksonJSONP

2021-06-15 07:59:01

Java生成隨機數Java編程

2019-04-02 15:07:51

API NginxZuul

2019-12-26 14:07:19

隨機數偽隨機多線程

2010-03-22 19:41:31

2020-07-27 08:24:42

編程語言C語言Java

2010-03-10 16:35:23

Python編程語言

2012-03-22 09:31:14

Java

2009-05-25 08:39:08

iPhone蘋果移動OS

2011-05-18 14:52:04

XML

2009-06-11 15:16:18

不重復隨機數Java

2017-05-29 09:56:25

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产欧美精品一区二区三区 | 天天曰天天干 | 99日韩 | 91超碰在线观看 | 亚洲精品久久久久久久久久久久久 | 欧美成年黄网站色视频 | 在线视频 亚洲 | 日韩精品一区二区不卡 | 久久精品中文字幕 | 国产有码 | 国产精品一区二区免费看 | 人干人操 | 一区二区三区四区免费观看 | 日韩一区二区三区在线 | 青青草av在线播放 | 久久精品免费 | 国产在线第一页 | 国产综合久久 | 色站综合 | 精品国产乱码久久久久久88av | 亚洲国产精品一区二区www | 日本超碰 | 久久伊人亚洲 | 在线免费观看毛片 | 黑人精品欧美一区二区蜜桃 | 国产一区二区三区四 | 久久精品视频在线观看 | 欧美精品一区免费 | 中文字幕第三页 | 九九精品网 | 国产精品久久国产精品 | 久久久久国产精品免费免费搜索 | 欧美日韩亚洲二区 | 亚洲成人精选 | 国产精品久久网 | 国产电影精品久久 | 欧美影院 | 午夜不卡福利视频 | 国产欧美一区二区三区日本久久久 | 日韩成人在线观看 | 精品成人|