回覆列表
  • 1 # java架構設計

    先來看一個簡單的實現:先將50個人進行1到50編號,然後來一段簡單的java隨機數程式碼,如下:

    上圖中的程式碼執行結果:

    這裡介紹一下Random及ThreadLocalRandom相關知識:

    int random = ThreadLocalRandom.current().nextInt(50) + 1

    在java中最直接、簡單的呼叫生成隨機數方式:

    new Random().nextInt()

    比如生成0.0到10.0之間的雙精度浮點數即:

    new Random().nextDouble(10)

    如果想生成整數即:

    new Random().nextInt(10)

    Random每次使用都得例項化一個物件

    多執行緒下使用單個Random例項生成隨機數時候,多個執行緒同時計算隨機數計算新的種子時候多個執行緒會競爭同一個原子變數的更新操作,由於原子變數的更新是CAS操作,同時只有一個執行緒會成功,所以會造成大量執行緒進行自旋重試,這是會降低併發效能的,所以ThreadLocalRandom應運而生。

    為了解決多執行緒高併發下Random的缺陷,JUC包下新增了ThreadLocalRandom類,如果每個執行緒維護自己的一個種子變數,每個執行緒生成隨機數時候根據自己老的種子計算新的種子,並使用新種子更新老的種子,然後根據新種子計算隨機數,就不會存在競爭問題,這會大大提高併發效能。

    日常開發中,經常會有生成一批隨機數的需求,比如訂單號的後4位採用隨機數,隨機輪詢,隨機獲取系統預設頭像等,大家可以在高併發的場景中嘗試一下併發包中的ThreadLocalRandom,感興趣的同學可以去看看相關原始碼。

  • 中秋節和大豐收的關聯?
  • 董明珠股東會提前洩露未公開重大資訊,證監會和交易所會怎麼處罰?