最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中ThreadLocalRandom的使用詳解

 更新時間:2020年03月27日 09:35:33   作者:flydean  
這篇文章主要介紹了java中ThreadLocalRandom的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在java中我們通常會需要使用到j(luò)ava.util.Random來便利的生產(chǎn)隨機(jī)數(shù)。但是Random是線程安全的,如果要在線程環(huán)境中的話就有可能產(chǎn)生性能瓶頸。

我們以Random中常用的nextInt方法為例來具體看一下:

  public int nextInt() {
    return next(32);
  }

nextInt方法實際上調(diào)用了下面的方法:

  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));
  }

從代碼中我們可以看到,方法內(nèi)部使用了AtomicLong,并調(diào)用了它的compareAndSet方法來保證線程安全性。所以這個是一個線程安全的方法。

其實在多個線程環(huán)境中,Random根本就需要共享實例,那么該怎么處理呢?

在JDK 7 中引入了一個ThreadLocalRandom的類。ThreadLocal大家都知道就是線程的本地變量,而ThreadLocalRandom就是線程本地的Random。

我們看下怎么調(diào)用:

ThreadLocalRandom.current().nextInt();

我們來為這兩個類分別寫一個benchMark測試:

public class RandomUsage {

  public void testRandom() throws InterruptedException {
    ExecutorService executorService=Executors.newFixedThreadPool(2);
    Random random = new Random();
    List<Callable<Integer>> callables = new ArrayList<>();
    for (int i = 0; i < 1000; i++) {
      callables.add(() -> {
        return random.nextInt();
      });
      }
    executorService.invokeAll(callables);
  }

  public static void main(String[] args) throws RunnerException {
    Options opt = new OptionsBuilder()
        .include(RandomUsage.class.getSimpleName())
        // 預(yù)熱5輪
        .warmupIterations(5)
        // 度量10輪
        .measurementIterations(10)
        .forks(1)
        .build();

    new Runner(opt).run();
  }
}
public class ThreadLocalRandomUsage {

  @Benchmark
  @BenchmarkMode(Mode.AverageTime)
  @OutputTimeUnit(TimeUnit.MICROSECONDS)
  public void testThreadLocalRandom() throws InterruptedException {
    ExecutorService executorService=Executors.newFixedThreadPool(2);
    List<Callable<Integer>> callables = new ArrayList<>();
    for (int i = 0; i < 1000; i++) {
      callables.add(() -> {
        return ThreadLocalRandom.current().nextInt();
      });
      }
    executorService.invokeAll(callables);
  }

  public static void main(String[] args) throws RunnerException {
    Options opt = new OptionsBuilder()
        .include(ThreadLocalRandomUsage.class.getSimpleName())
        // 預(yù)熱5輪
        .warmupIterations(5)
        // 度量10輪
        .measurementIterations(10)
        .forks(1)
        .build();

    new Runner(opt).run();
  }
}

分析運行結(jié)果,我們可以看出ThreadLocalRandom在多線程環(huán)境中會比Random要快。

本文的例子可以參考https://github.com/ddean2009/learn-java-concurrency/tree/master/ThreadLocalRandom

到此這篇關(guān)于java中ThreadLocalRandom的使用詳解的文章就介紹到這了,更多相關(guān)java ThreadLocalRandom內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring MVC Mybatis多數(shù)據(jù)源的使用實例解析

    Spring MVC Mybatis多數(shù)據(jù)源的使用實例解析

    項目需要從其他網(wǎng)站獲取數(shù)據(jù),因為是臨時加的需求,這篇文章主要介紹了Spring MVC Mybatis多數(shù)據(jù)源的使用實例解析,需要的朋友可以參考下
    2016-12-12
  • springAOP完整實現(xiàn)過程

    springAOP完整實現(xiàn)過程

    當(dāng)你調(diào)用SimpleService類的doSomething方法時,上述的PerformanceAspect會自動攔截此調(diào)用,并且記錄該方法的執(zhí)行時間,這樣你就完成了一個針對Spring的AOP入門級案例,感興趣的朋友一起看看吧
    2024-02-02
  • Java 中的io模型詳解

    Java 中的io模型詳解

    這篇文章主要介紹了Java 中io模型的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-04-04
  • Android開發(fā)Kotlin實現(xiàn)圓弧計步器示例詳解

    Android開發(fā)Kotlin實現(xiàn)圓弧計步器示例詳解

    這篇文章主要為大家介紹了Android開發(fā)Kotlin繪制圓弧計步器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Java?Handler同步屏障淺析講解

    Java?Handler同步屏障淺析講解

    同步屏障機(jī)制是什么?Handler發(fā)送的消息分為普通消息、屏障消息、異步消息,一旦Looper在處理消息時遇到屏障消息,那么就不再處理普通的消息,而僅僅處理異步的消息。不再使用屏障后,需要撤銷屏障,不然就再也執(zhí)行不到普通消息了
    2022-08-08
  • java組件smartupload實現(xiàn)上傳文件功能

    java組件smartupload實現(xiàn)上傳文件功能

    這篇文章主要為大家詳細(xì)介紹了java組件smartupload實現(xiàn)上傳文件功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • SpringBoot中登錄驗證碼的4種實現(xiàn)方案

    SpringBoot中登錄驗證碼的4種實現(xiàn)方案

    這篇文章主要介紹了在SpringBoot應(yīng)用中實現(xiàn)四種登錄驗證碼的技術(shù)方案,包括圖形驗證碼、短信驗證碼、郵箱驗證碼和滑動拼圖驗證碼,需要的可以參考下
    2025-04-04
  • 分享Java開發(fā)必須掌握的日志分析命令

    分享Java開發(fā)必須掌握的日志分析命令

    這篇文章主要介紹了分享Java開發(fā)必須掌握的日志分析命令,在日常工作中,如果我們遇到線上問題,一般的處理步驟應(yīng)該是先保留現(xiàn)場,然后再考慮回滾,之后再是解決問題
    2019-07-07
  • Spark調(diào)度架構(gòu)原理詳解

    Spark調(diào)度架構(gòu)原理詳解

    這篇文章主要介紹了Spark 調(diào)度架構(gòu)原理詳解,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • java?mybatis如何操作postgresql?array數(shù)組類型

    java?mybatis如何操作postgresql?array數(shù)組類型

    這篇文章主要介紹了java?mybatis如何操作postgresql?array數(shù)組類型,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評論

乌兰浩特市| 深圳市| 秭归县| 天柱县| 罗田县| 田东县| 龙口市| 思茅市| 河津市| 香格里拉县| 崇仁县| 新密市| 昌宁县| 东台市| 依安县| 枣庄市| 巴青县| 集贤县| 贵南县| 贺州市| 武冈市| 分宜县| 海城市| 赞皇县| 千阳县| 黄梅县| 贡山| 丹巴县| 荥经县| 句容市| 汉沽区| 泸西县| 宜城市| 通山县| 昌乐县| 峨山| 苍梧县| 长白| 宿州市| 临沧市| 都昌县|