生成一个新的JMH工程的maven命令:
mvn archetype:generate
-DinteractiveMode=false
-DarchetypeGroupId=org.openjdk.jmh
-DarchetypeArtifactId=jmh-java-benchmark-archetype
-DgroupId=com.enjoy.jmh
-DartifactId=wl
-Dversion=1.0.0-SNAPSHOT
在命令后面加一个 -X 就可以查看到详细日志,执行上面命令后,会创建一个Maven工程,但是默认生成的MyBenchmark.java类
生成的项JmhTest,导入idea中
还需要增加一个jar包
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
项目打包jar包
运行jar包:java -jar benchmarks.jar
结果:
以上结果可以看出,这两个方法的执行时间基本上差不多,这是为什么呢,是因为锁消除呀(表情包)。
因为JIT(即时编译器)会对代码做了优化–锁消除,对于b方法来说,这把锁并没有什么鬼用,这对象o都逃离不了这个方法,如果有返回值的话就需要加锁,加不加锁都不影响是否有安全问题。一百个线程有一百个o对象。
synchronized还是有意义的,但也会很影响我们的性能。。。。