提交订单性能优化系列之008-对比static方法与非static方法


概括总结

在这个版本中,把提交订单的方法设置成public static synchronized的,与仅仅是设置public synchronized的,在提交订单的性能上有什么差别?答案是:没有明显区别(是同样的差)。


008版本更新说明

复制出了一个文件,如下图,其中Version008Static类中的提交订单方法是public static synchronized的,Version008Normal类中的提交订单方法是public synchronized的,其他没有差别。

Snipaste_20180925_203536png


测试结果

统计10次测试之后的平均值之后:

调用Version008Normal类中的提交订单方法时,每秒钟可以提交的订单数为:9

调用Version008Static类中的提交订单方法时,每秒钟可以提交的订单数为:9

两者是一样的。当然,由于9.9向下取整也是9,9.0向下取整也是9,所以从这个值来估算的话,最高还是有可能存在不超过10%的误差。

那么可以对比另一个值:

调用Version008Normal类中的提交订单方法时,提交每个订单平均耗时的纳秒数:102392535

调用Version008Static类中的提交订单方法时,提交每个订单平均耗时的纳秒数:101756665

性能差别为:(102392535 - 101756665) / 102392535 * 100% = 0.62%,也没有什么明显差别。

【备注】:不同的机器上的测试结果会不一样,以上测试结果仅供参考。


为什么没有明显差别

当一个方法被标记为public static synchronized时,它的含义是:同一时间只有一个线程能访问属于这个类的任意一个static synchronized方法。

  1. 这里锁的是Class对象,同一个JVM中,同一个类只会有同一个Class对象。
  2. 什么叫"属于这个类"?大范围为说,类中的一切都是属于这个类的,不过我们现在讨论的是同步这个小范围,所以可以认为static synchronized标记的方法就是属于这个类的。

当一个方法被标记为public synchronized时,它的含义是:同一时间只有一个线程能访问属于这个类的的当前这个实例对象的任意一个synchronized方法。

  1. 这里锁的是普通的类的实例对象,同一个JVM中,理论上可以存在无数个同一个类的不同的实例对象。
  2. 什么叫"属于这个对象"?从同步的角度来说,就是标记为synchronized但是没有被标记为static的方法。

在这次测试中,上锁的Class对象只有一个,就是Version008Static.class,上锁的实例对象也只有一个,就是从Version008Normal.class new 出来的一个实例,而类中又都只有一个synchronized的方法,不存在多个线程同时调用同一个方法的情况,两种测试都相当于被转换成了单线程测试,因此没有差别。


补充说明

在正常项目中开发时,不可能把一个提交订单的方法设置为public static的,所以这一版本的测试仅仅只是个示例,只是出于好奇想看看结果是怎样的,没有任何参考价值。从下版本开始,将不再使用public static方法。


源码

008版本的github源码在这里
如果不知道怎样运行项目,请参考这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值