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

ThreadLocalRandom類原理分析

開發 前端
mix32是一個固定的算法,這里重點看下nextSeed方法,當第一次調用的時候進行初始化,獲取當前線程threadLocalRandomSeed的值(第一次默認值為0) + 種子增量,如果不是第一次那么獲取舊種子的值 + 種子增量生成新的種子變量并設置回去。這樣的話多線程環境下就避免了競爭,因為threadLocalRandomSeed是Thread的一個變量,屬于線程級別。

[[428387]]

本文轉載自微信公眾號「一個程序員的成長」,作者一個程序員的成長。轉載本文請聯系一個程序員的成長公眾號。

1、Random類及其局限性

  1. public int nextInt(int bound) { 
  2.     if (bound <= 0) 
  3.         throw new IllegalArgumentException(BadBound); 
  4.     // 計算新的種子 
  5.     int r = next(31); 
  6.     int m = bound - 1; 
  7.     // 根據新的種子計算隨機數 
  8.     if ((bound & m) == 0)  // i.e., bound is a power of 2 
  9.         r = (int)((bound * (long)r) >> 31); 
  10.     else { 
  11.         for (int u = r; 
  12.              u - (r = u % bound) + m < 0; 
  13.              u = next(31)) 
  14.             ; 
  15.     } 
  16.     return r; 
  1. protected int next(int bits) { 
  2.     long oldseed, nextseed; 
  3.     // 這是一個原子性的變量 
  4.     AtomicLong seed = this.seed; 
  5.     do { 
  6.         // (1)、獲取老的種子 
  7.         oldseed = seed.get(); 
  8.         // (2)、計算出新的種子 
  9.         nextseed = (oldseed * multiplier + addend) & mask; 
  10.     // (3)、CAS操作更新老的種子 
  11.     } while (!seed.compareAndSet(oldseed, nextseed)); 
  12.     return (int)(nextseed >>> (48 - bits)); 

Random小結:

  • 面試:多線程下Random存在什么樣的問題?

每個Random實例里面都有一個原子性的種子變量用來記錄當前的種子值,當要生成新的隨機數時需要根據當前的種子計算新的種子并更新種子變量。當在多線程環境下,多個線程會競爭同一個原子變量的更新操作,由于原子變量的更新時CAS操作,同時只有一個線程會成功,所以會造成大量線程進行自旋重試,從而降低并發性能。

可能出現的癥狀:如果并發請求非常多,自旋鎖一直重試,那么CPU會一直飆升。

2、ThreadLocalRandom

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

這個方法用來創建ThreadLocalRandom隨機數生成器,如果當前線程中threadLocalRandomProbe的變量值為0,則說明是第一次調用current方法,那么就調用localInit方法初始化種子變量。

這里使用了延遲初始化,在localInit方法中,并沒有初始化種子變量,而是在需要生成隨機數的時候再生成種子變量,這是一種優化。

  1. static final void localInit() { 
  2.     int p = probeGenerator.addAndGet(PROBE_INCREMENT); 
  3.     int probe = (p == 0) ? 1 : p; // skip 0 
  4.     long seed = mix64(seeder.getAndAdd(SEEDER_INCREMENT)); 
  5.     Thread t = Thread.currentThread(); 
  6.     UNSAFE.putLong(t, SEED, seed); 
  7.     UNSAFE.putInt(t, PROBE, probe); 
  1. final long nextSeed() { 
  2.     Thread t; long r; // read and update per-thread seed 
  3.     // 生成新種子(獲取當前線程種子 + 種子增量) 
  4.     UNSAFE.putLong(t = Thread.currentThread(), SEED, 
  5.                    r = UNSAFE.getLong(t, SEED) + GAMMA); 
  6.     return r; 

mix32是一個固定的算法,這里重點看下nextSeed方法,當第一次調用的時候進行初始化,獲取當前線程threadLocalRandomSeed的值(第一次默認值為0) + 種子增量,如果不是第一次那么獲取舊種子的值 + 種子增量生成新的種子變量并設置回去。這樣的話多線程環境下就避免了競爭,因為threadLocalRandomSeed是Thread的一個變量,屬于線程級別。

 

責任編輯:武曉燕 來源: 一個程序員的成長
相關推薦

2021-05-13 10:40:16

ThreadLocal代碼Java

2022-12-15 08:54:28

JAVA性能JDK

2020-10-13 07:35:22

JUC - Count

2023-04-26 08:39:41

Bitmap元素存儲

2022-04-13 08:23:31

Golang并發

2012-12-03 16:57:37

HDFS

2021-08-09 11:15:28

MybatisJavaSpring

2009-11-06 09:22:46

WCF應用

2021-04-21 15:17:10

WebsocketWsnodejs

2021-11-26 17:17:43

Android廣播運行原理源碼分析

2017-02-09 13:23:46

2015-06-15 10:12:36

Java原理分析

2015-09-23 16:14:03

Ryu拓撲結構

2023-02-07 09:17:19

Java注解原理

2022-04-12 08:30:45

TomcatWeb 應用Servlet

2011-06-21 09:22:53

Random類

2023-10-31 16:00:51

類加載機制Java

2009-11-06 13:25:35

Visual Stud

2012-12-03 17:12:10

HDFS

2023-05-31 08:39:04

redis事件驅動
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久亚洲一区二区三区四区 | a在线视频观看 | 亚洲午夜精品 | 久久91av| 国产精选一区 | 免费a网 | 国产精品美女www爽爽爽视频 | 日韩欧美在线观看 | 国色天香成人网 | 男女污网站 | 毛片免费看| 国产伦精品一区二区三区照片91 | 成在线人视频免费视频 | 欧美国产日韩在线观看 | 日韩av免费在线观看 | 日韩av啪啪网站大全免费观看 | 午夜精品久久久久久久久久久久久 | 国产精品一区二区三区在线 | 亚洲国产精品久久久久 | 精品国产色 | 亚洲一区二区三区四区视频 | 国产精品一区二区av | 岛国在线免费观看 | 精品久久久久香蕉网 | 精品一区二区三区不卡 | 一级做a爰片性色毛片16美国 | 久久伊人精品 | 国产一区二区三区视频 | 日日日日操 | 久久久人 | 欧美日韩国产一区二区三区 | 精品久久1| 亚洲激精日韩激精欧美精品 | 九九热免费在线观看 | 日本天堂一区二区 | 正在播放国产精品 | 成人免费精品 | 九九九视频 | 狠狠色香婷婷久久亚洲精品 | 久久精品中文 | 久久久国产网站 |