博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
测试Java同步、锁、原子类的同步性能
阅读量:4040 次
发布时间:2019-05-24

本文共 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/

你可能感兴趣的文章
Java.nio
查看>>
函数模版类模版和偏特化泛化的总结
查看>>
VMware Workstation Pro虚拟机不可用解决方法
查看>>
最简单的使用redis自带程序实现c程序远程访问redis服务
查看>>
redis学习总结-- 内部数据 字符串 链表 字典 跳跃表
查看>>
iOS 对象序列化与反序列化
查看>>
iOS 序列化与反序列化(runtime) 01
查看>>
iOS AFN 3.0版本前后区别 01
查看>>
iOS ASI和AFN有什么区别
查看>>
iOS QQ侧滑菜单(高仿)
查看>>
iOS 扫一扫功能开发
查看>>
iOS app之间的跳转以及传参数
查看>>
iOS __block和__weak的区别
查看>>
Android(三)数据存储之XML解析技术
查看>>
Spring JTA应用之JOTM配置
查看>>
spring JdbcTemplate 的若干问题
查看>>
Servlet和JSP的线程安全问题
查看>>
GBK编码下jQuery Ajax中文乱码终极暴力解决方案
查看>>
Oracle 物化视图
查看>>
PHP那点小事--三元运算符
查看>>