前言

前些天公司线上发生事故,在排查原因的过程中发现代码中出现了synchronized关键字。在学习java的时候我们都知道synchronized关键字的语法含义。多个线程对于同一个对象上的synchronized方法是串行访问的。它是一把双刃剑,在防止并发访问公共数据的同时也对性能产生了影响。究竟synchronized关键字回性能有多大影响,今天我们来做一个小实验。

实验过程

1 写两段简单的代码(SpringMVC)

无synchronized版
@RequestMapping("testSyn")
@ResponseBody
public String testSyn() {
    try {
        Thread.sleep(10);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "ok";
}
有synchronized版
@RequestMapping("testSyn")
@ResponseBody
public synchronized String testSyn() {
    try {
        Thread.sleep(10);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "ok";
}
用sleep模拟一个需要一小段时间的操作

2 在本机启动web应用

3 对http://127.0.0.1:8080/testSyn接口进行压测

vUser设为99

实验结果

无synchronized版

图片描述

有synchronized版

图片描述

实验结果分析

从上面的结果可以发现无synchronized的tps约为有synchronized的5倍,且有synchronized关键字的版本平均响应时间已经超过1秒,严重影响了用户体验。因此在单机同时处理99个vUser的场景时,synchronized关键字会对响应时间有明显的影响。如果当前的服务是为上层其他应用服务的时候则有可能产生大量超时,进而引发雪崩效应。因此在生产环境建议谨慎使用synchronized关键字。


gzlwow
32 声望4 粉丝