真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

JMH測試AtomicLong和LongAdder的性能

AtomicLong 和 LongAdder 的區(qū)別

AtomicLong

1、AtomicLong是利用了底層的CAS操作來提供并發(fā)性。
2、在并發(fā)量較低的環(huán)境下,線程沖突的概率比較小,自旋的次數(shù)不會很多。但是,高并發(fā)環(huán)境下,N個線程同時進(jìn)行自旋操作,會出現(xiàn)大量失敗并不斷自旋的情況,此時AtomicLong的自旋會成為瓶頸。
3、AtomicLong中有個內(nèi)部volatile變量value保存著實際的long值,所有的操作都是針對該變量進(jìn)行。也就是說,高并發(fā)環(huán)境下,value變量其實是一個熱點(diǎn),也就是N個線程競爭一個熱點(diǎn)。

創(chuàng)新互聯(lián)主營永城網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都App定制開發(fā),永城h5成都微信小程序搭建,永城網(wǎng)站營銷推廣歡迎永城等地區(qū)企業(yè)咨詢

LongAdder

1、LongAdder的基本思路就是分散熱點(diǎn),將value值分散到一個數(shù)組中,不同線程會命中到數(shù)組的不同槽中,各個線程只對自己槽中的那個值進(jìn)行CAS操作,這樣熱點(diǎn)就被分散了,沖突的概率就小很多。如果要獲取真正的long值,只要將各個槽中的變量值累加返回。
2、低并發(fā)、一般的業(yè)務(wù)場景下AtomicLong是足夠了。如果并發(fā)量很多,存在大量寫多讀少的情況,那LongAdder可能更合適。

利用JMH測試AtomicLong和LongAdder的性能

1、創(chuàng)建一個Maven工程,Pom.xml代碼如下



    4.0.0

    com.jane
    jmh2
    1.0-SNAPSHOT

    
        
        
            org.openjdk.jmh
            jmh-core
            1.20
        
        
            org.openjdk.jmh
            jmh-generator-annprocess
            1.20
        
    
    
        
            
                org.codehaus.mojo
                exec-maven-plugin
                
                    
                        run-benchmarks
                        integration-test
                        
                            exec
                        
                        
                            test
                            java
                            
                                -classpath
                                
                                org.openjdk.jmh.Main
                                .*
                            
                        
                    
                
            
        
    

2、啟動文件

package com.jane;

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.LongAdder;

@BenchmarkMode(Mode.AverageTime) // 測試方法平均執(zhí)行時間,如果測試吞入量則換成Mode.Throughput
@OutputTimeUnit(TimeUnit.MICROSECONDS) // 輸出結(jié)果的時間粒度為微秒
public class Main {
    private static AtomicLong count = new AtomicLong();
    private static LongAdder longAdder = new LongAdder();

    @Benchmark
    @Threads(1) //單位時間內(nèi)也,默認(rèn)一秒啟動多少個線程進(jìn)行測試
    public void atolong(){
        count.getAndIncrement(); //測試AtomicLong遞增方法
    }

    @Benchmark
    @Threads(1) //單位時間內(nèi)也,默認(rèn)一秒啟動多少個線程進(jìn)行測試
    public void loadder(){
        longAdder.increment();//測試LongAdder的遞增方法
    }

    public static void main(String[] args) throws RunnerException {
        Options options = new OptionsBuilder()
                .include(Main.class.getSimpleName())
                .forks(1)
                .build();
        new Runner(options).run();
    }
}

3、單線程下的性能對比

JMH測試AtomicLong和LongAdder的性能

吞吐量:AtomicLong性能更好

JMH測試AtomicLong和LongAdder的性能

平均消耗時間:AtomicLong耗時更小

JMH測試AtomicLong和LongAdder的性能

4、20個線程下的性能對比

JMH測試AtomicLong和LongAdder的性能

吞吐量:LongAdder優(yōu)勢明顯

JMH測試AtomicLong和LongAdder的性能

平均消耗時間:LongAdder優(yōu)勢明顯

JMH測試AtomicLong和LongAdder的性能


網(wǎng)站名稱:JMH測試AtomicLong和LongAdder的性能
URL鏈接:http://weahome.cn/article/gpgdeg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部