代码:
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% WAITING
Result "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_WAITING
Result "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_WAITING
Benchmark Mode Cnt Score Error Units
AtomicTest.atom avgt 5 0.095 ± 0.005 us/op
AtomicTest.atom:·stack avgt NaN ---
AtomicTest.lock avgt 5 0.216 ± 0.012 us/op
AtomicTest.lock:·stack avgt NaN ---
AtomicTest.sync avgt 5 0.273 ± 0.046 us/op
AtomicTest.sync:·stack avgt NaN ---
测试结果分析:
1、从运行时间上来看,原子类的原子性操作运行速度更快,速度是lock同步的2倍以上,速度最慢的synchronized同步。
2、同步运行的时间损耗主要体现在等待和阻塞上,降低阻塞和等待的时间会极大的提高同步的效率。