Java Web应用高并发下processMethod是串行执行还是并行执行?
这个问题的答案没有100%的定论,完全取决于你的Web服务部署配置、MyClass的实例化逻辑、processMethod有没有加同步限制三个因素,你贴的这段代码本身没有任何同步约束,默认场景下是并行处理的:
默认情况(绝大多数Java Web应用的配置)
我们平时用的Spring Boot、SSM这类框架搭配Tomcat/Jetty容器的场景:
- Web容器默认会启动线程池处理请求,默认最大工作线程数一般在200~500区间,每个请求会分配一个独立线程处理
- 如果
MyClass是Spring默认的单例Bean,多个线程会同时调用同一个实例的processMethod方法,只要方法内部没有加锁、没有操作需要串行排队的共享资源,多个线程就会并行执行这个方法 - 10万并发过来的话,超过线程池最大线程数的请求会进入容器的等待队列排队,已经分配到线程的请求依然是并行处理
processMethod的,不会串行走。
会变成串行处理的特殊情况
只有满足以下任意一种情况,请求才会排队串行执行这个方法:
- 你给
processMethod加了synchronized修饰:相当于给整个方法加了对象锁,同一个MyClass实例的这个方法同一时间只能有一个线程进入,所有请求都会排队 processMethod内部所有逻辑都抢同一个排他资源:比如所有请求都竞争同一把分布式锁、或者都修改数据库同一条加了行锁的记录,即便方法本身没加锁,底层逻辑也会变成串行- 你手动把Web容器改成了单线程模式:这个属于极端特殊配置,基本没人会这么用
给新手的提醒
你现在写的这个方法如果内部操作了MyClass的成员变量,多线程并行修改会出现数据错乱的线程安全问题,优化建议:
- 方法内部用到的临时变量尽量定义成局部变量,局部变量存在于每个线程的私有栈中,不会被其他线程修改,天生线程安全
- 如果必须操作共享资源,不要直接给整个方法加
synchronized,否则10万并发过来排队会直接把服务拖垮,尽量用细粒度锁或者线程安全的工具类来处理
public class MyClass { private String processMethod(String a) { //do something. } }
内容的提问来源于stack exchange,提问作者average.joe
相关产品推荐
相关产品推荐

