<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    聶永的博客

    記錄工作/學(xué)習(xí)的點點滴滴。

    Fork/Join模式(JSR166y)手記之ThreadLocalRandom

    ThreadLocalRandom是一個可以獨立使用的、用于生成隨機數(shù)的類。繼承自Random,但性能超過Random,所謂“青出于藍而勝于藍”。其API所提供方法,不多,父類Random具有的,它也一樣具有。從表明看,是一個單例模式,其實不然:
    private static final ThreadLocal localRandom =
    new ThreadLocal() {
    protected ThreadLocalRandom initialValue() {
    return new ThreadLocalRandom();
    }
    };

    ThreadLocalRandom() {
    super();
    initialized = true;
    }


    public static ThreadLocalRandom current() {
    return localRandom.get();
    }
    采用ThreadLocal進行包裝的Random子類,每線程對應(yīng)一個ThreadLocalRandom實例。測試代碼:
    @Test
    public void testInstance() {
    final ThreadLocalRandom threadLocalRandom = ThreadLocalRandom.current();
    final List randomList = new ArrayList();
    final Phaser barrier = new Phaser(1);

    new Thread() {
    @Override
    public void run() {
    randomList.add(ThreadLocalRandom.current());
    barrier.arrive();
    }
    }.start();

    barrier.awaitAdvance(barrier.getPhase());
    if (randomList.isEmpty()) {
    throw new NullPointerException();
    }

    Assert.assertTrue(threadLocalRandom != randomList.get(0));
    }
    這么一包裝,在性能上可以趕超Math.random(),不錯。
    @Test
    public void testSpeed() {
    final int MAX = 100000;
    ThreadLocalRandom threadLocalRandom = ThreadLocalRandom.current();

    long start = System.nanoTime();
    for (int i = 0; i < MAX; i++) {
    threadLocalRandom.nextDouble();
    }
    long end = System.nanoTime() - start;
    System.out.println("use time1 : " + end);

    long start2 = System.nanoTime();
    for (int i = 0; i < MAX; i++) {
    Math.random();
    }
    long end2 = System.nanoTime() - start2;
    System.out.println("use time2 : " + end2);

    Assert.assertTrue(end2 > end);
    }
    非規(guī)范的性能測試,某次輸出結(jié)果:
    use time1 : 3878481
    use time2 : 8633080
    性能差別不止兩倍啊,哈哈。
    再看Math.random(),其生成也是依賴于Random類:
    private static Random randomNumberGenerator;

    private static synchronized void initRNG() {
    if (randomNumberGenerator == null)
    randomNumberGenerator = new Random();
    }

    public static double random() {
    if (randomNumberGenerator == null) initRNG();
    return randomNumberGenerator.nextDouble();
    }
    很奇怪,性能為什么差那么遠呢?可能個各自的next函數(shù)不同造成。看一下Random中的next(int bits)方法實現(xiàn):
    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));
    }
    而ThreadLocalRandom的重寫版本為:
    protected int next(int bits) {  
    rnd = (rnd * multiplier + addend) & mask;
    return (int) (rnd >>> (48-bits));
    }
    相比ThreadLocalRandom的next(int bits)函數(shù)實現(xiàn)上更為簡練,不存在seed的CAS操作,并且少了很多的運算量。
    更為詳細的機制研讀,請閱讀參考資料中鏈接。
    另外,ThreadLocalRandom 也提供了易用的,兩個數(shù)字之間的隨機數(shù)生成方式。類似于:
    nextDouble(double least, double bound)
    nextInt(int least, int bound)
    nextLong(long least, long bound)
    隨機數(shù)的生成范圍為 最小值 <= 隨機數(shù) < 最大值。可以包含最小值,但不包含最大值。
    @Test
    public void testHowtoUse(){
    final ThreadLocalRandom threadLocalRandom = ThreadLocalRandom.current();
    final int MAX = 100;
    int result = threadLocalRandom.nextInt(0, 100);
    Assert.assertTrue(MAX > result);
    }
    嗯,還有,不支持setSeed方法。
    曾經(jīng)JDK 7中,ThreadLocalRandom 存在隨機多個線程隨機數(shù)生成相同的bug,但最新版本中,已不存在,被修復(fù)了,可以放心使用。從現(xiàn)在開始,完全可以使用ThreadLocalRandom替代Random,尤其是在并發(fā)、并行、多任務(wù)等環(huán)境下,會比在多線程環(huán)境下使用公共共享的Random對象實例更為有效。
    代碼清單:

    參考資料:
    1. Java 7: How to write really fast Java code

    posted on 2012-02-04 11:29 nieyong 閱讀(1583) 評論(0)  編輯  收藏 所屬分類: Java

    公告

    所有文章皆為原創(chuàng),若轉(zhuǎn)載請標明出處,謝謝~

    新浪微博,歡迎關(guān)注:

    導(dǎo)航

    <2012年2月>
    2930311234
    567891011
    12131415161718
    19202122232425
    26272829123
    45678910

    統(tǒng)計

    常用鏈接

    留言簿(58)

    隨筆分類(130)

    隨筆檔案(151)

    個人收藏

    最新隨筆

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲午夜久久久久妓女影院| 99视频在线免费看| 韩国日本好看电影免费看| 亚洲另类激情综合偷自拍| 成人影片一区免费观看| 亚洲人成伊人成综合网久久久| 日韩a毛片免费观看| 免费一级毛片不卡在线播放| 精品久久久久久亚洲中文字幕| 免费一看一级毛片全播放| 日韩精品无码免费视频| 久久亚洲AV永久无码精品| 久久久久久av无码免费看大片| 国产精品久久久亚洲| 99免费视频观看| 亚洲最大的成人网| 免费人成在线观看播放国产| 美女羞羞视频免费网站| 国产亚洲视频在线播放| 久久久久久一品道精品免费看| 97久久精品亚洲中文字幕无码| 日韩版码免费福利视频| 亚洲一区二区三区成人网站| 免费a级毛片18以上观看精品| caoporn国产精品免费| 亚洲一区二区在线视频| 最近中文字幕mv免费高清视频7| 亚洲欧美中文日韩视频| 久久久久亚洲?V成人无码| 日韩精品无码一区二区三区免费 | 亚洲一区精品伊人久久伊人 | 久艹视频在线免费观看| 亚洲午夜电影在线观看| 国产公开免费人成视频| 国产线视频精品免费观看视频| 亚洲精品中文字幕无乱码| 凹凸精品视频分类国产品免费| 黄色片免费在线观看| 亚洲日韩国产一区二区三区在线| 亚洲国产精品自产在线播放| 99爱在线观看免费完整版|