本文共 3681 字,大约阅读时间需要 12 分钟。
代码:
import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;import org.openjdk.jmh.annotations.Benchmark;import org.openjdk.jmh.annotations.BenchmarkMode;import org.openjdk.jmh.annotations.Group;import org.openjdk.jmh.annotations.GroupThreads;import org.openjdk.jmh.annotations.Measurement;import org.openjdk.jmh.annotations.Mode;import org.openjdk.jmh.annotations.OutputTimeUnit;import org.openjdk.jmh.annotations.Scope;import org.openjdk.jmh.annotations.State;import org.openjdk.jmh.annotations.Warmup;import org.openjdk.jmh.profile.StackProfiler;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 org.openjdk.jmh.runner.options.TimeValue;@Measurement(iterations=5)@Warmup(iterations=5)@BenchmarkMode(Mode.AverageTime)@OutputTimeUnit(TimeUnit.MICROSECONDS)@State(Scope.Group)public class AtomicTest { private int x=0; private int y=0; private AtomicInteger z=new AtomicInteger(); private final Lock lock=new ReentrantLock(); @GroupThreads(10) @Group("lock") @Benchmark public void lockInc() { lock.lock(); try { x++; }finally { lock.unlock(); } } @GroupThreads(10) @Group("sync") @Benchmark public void synInc() { synchronized(this) { y++; } } @GroupThreads(10) @Group("atom") @Benchmark public void atomicInc() { z.incrementAndGet(); } public static void main(String[] args) { Options opt=new OptionsBuilder() .include(AtomicTest.class.getSimpleName()) .forks(1) .timeout(TimeValue.seconds(10)) .addProfiler(StackProfiler.class) .build(); try { new Runner(opt).run(); } catch (RunnerException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
运行后的测试结果:
Result "jmhtest.AtomicTest.atom": 0.095 ±(99.9%) 0.005 us/op [Average] (min, avg, max) = (0.094, 0.095, 0.098), stdev = 0.001 CI (99.9%): [0.090, 0.101] (assumes normal distribution)Secondary result "jmhtest.AtomicTest.atom:·stack":Stack profiler:....[Thread state distributions].................................................................... 89.9% RUNNABLE 9.1% TIMED_WAITING 1.0% WAITINGResult "jmhtest.AtomicTest.lock": 0.216 ±(99.9%) 0.012 us/op [Average] (min, avg, max) = (0.214, 0.216, 0.221), stdev = 0.003 CI (99.9%): [0.205, 0.228] (assumes normal distribution)Secondary result "jmhtest.AtomicTest.lock:·stack":Stack profiler:....[Thread state distributions].................................................................... 79.2% WAITING 11.7% RUNNABLE 9.1% TIMED_WAITINGResult "jmhtest.AtomicTest.sync": 0.273 ±(99.9%) 0.046 us/op [Average] (min, avg, max) = (0.260, 0.273, 0.292), stdev = 0.012 CI (99.9%): [0.227, 0.318] (assumes normal distribution)Secondary result "jmhtest.AtomicTest.sync:·stack":Stack profiler:....[Thread state distributions].................................................................... 70.2% BLOCKED 20.6% RUNNABLE 9.1% TIMED_WAITINGBenchmark Mode Cnt Score Error UnitsAtomicTest.atom avgt 5 0.095 ± 0.005 us/opAtomicTest.atom:·stack avgt NaN ---AtomicTest.lock avgt 5 0.216 ± 0.012 us/opAtomicTest.lock:·stack avgt NaN ---AtomicTest.sync avgt 5 0.273 ± 0.046 us/opAtomicTest.sync:·stack avgt NaN ---
测试结果分析:
1、从运行时间上来看,原子类的原子性操作运行速度更快,速度是lock同步的2倍以上,速度最慢的synchronized同步。
2、同步运行的时间损耗主要体现在等待和阻塞上,降低阻塞和等待的时间会极大的提高同步的效率。
转载地址:http://fhpdi.baihongyu.com/