成人免费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

2022-04-13 08:23:31

Golang并發

2020-10-13 07:35:22

JUC - Count

2023-04-26 08:39:41

Bitmap元素存儲

2012-12-03 16:57:37

HDFS

2015-09-23 16:14:03

Ryu拓撲結構

2022-04-12 08:30:45

TomcatWeb 應用Servlet

2023-02-07 09:17:19

Java注解原理

2021-08-09 11:15:28

MybatisJavaSpring

2009-11-06 09:22:46

WCF應用

2021-04-21 15:17:10

WebsocketWsnodejs

2015-06-15 10:12:36

Java原理分析

2021-11-26 17:17:43

Android廣播運行原理源碼分析

2017-02-09 13:23:46

2011-06-21 09:22:53

Random類

2023-10-31 16:00:51

類加載機制Java

2016-09-12 14:33:20

javaHashMap

2017-04-12 10:02:21

Java阻塞隊列原理分析

2009-03-26 13:43:59

實現Order ByMySQL
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九九九视频在线观看 | 国产精品久久久久久福利一牛影视 | 有码在线 | 福利精品在线观看 | 国产成人综合在线 | 国产一区二区小视频 | 能免费看的av | 97精品超碰一区二区三区 | www在线视频 | 久久精品国产一区 | 三级成人片 | 日韩在线免费 | 国产精品我不卡 | 欧美久久久久久久 | 国产一区二区三区视频 | 国产精品久久久久久久久久免费看 | 精品国产免费人成在线观看 | 亚洲国产看片 | 日日操夜夜操天天操 | 欧美一级黄色片 | 在线中文字幕亚洲 | 黄色毛片在线看 | 亚洲国产成人精品女人久久久 | 亚洲欧美综合 | 精品视频一区二区三区在线观看 | 国产免费拔擦拔擦8x高清 | 久久久精品在线 | 日韩欧美在线视频 | 亚洲精彩免费视频 | 91久久国产综合久久 | 福利精品 | 中文字幕 国产 | av黄色国产 | 天天干天天玩天天操 | 久久久久网站 | 日韩精品久久久久 | 午夜a√| 精品在线免费看 | 激情国产在线 | 欧美一区二区成人 | 亚洲欧美日韩电影 |