SpringBoot中synchronized锁对象不同引发性能差异的疑问
问题原因解析
核心差异出在锁的并发粒度上,和Spring Boot单例Bean的特性直接相关:
- 用
synchronized(this)时:@Service默认是单例Bean,this指向应用中唯一的MyService实例。这意味着methodA、methodB、methodC三个方法共享同一把锁——不管调用哪个方法,所有线程都得排队争抢这同一个锁,三个方法完全串行执行,并发度被压到最低,必然出现性能变慢。 - 改用成员对象作为锁时:如果三个方法分别使用不同的成员锁对象(比如methodA锁
objA、methodB锁objB、methodC锁objC),那三个方法的锁就互不干扰。线程调用不同方法时不会互相阻塞,并发度恢复正常,性能变慢的现象自然消失。要是三个方法用的是同一个成员锁对象,性能表现应该和synchronized(this)一致,可以检查下代码是否给每个方法分配了独立的锁对象。
补充:如果三个方法用同一个成员锁却仍性能正常,那可以排查下Spring代理的特殊情况(比如CGLIB代理下this指向代理对象,而成员锁是目标对象的属性),但这种情况概率极低,核心还是锁的并发粒度问题。
内容的提问来源于stack exchange,提问作者Somen Biswas
相关产品推荐
相关产品推荐

