Spring Boot 思考
Jihongchang(讨论 | 贡献)2023年2月20日 (一) 12:22的版本
Spring Boot 中的 bean 默认都是 singleton(单例模式),就是说一个 bean 只有一个对象;
如果改成 prototype(原型),能提高并发处理能力吗?
测试:新建一个 web 项目,在这个项目中新建一个 RestController,代码如下
@RestController
public class TestController {
AtomicInteger a = new AtomicInteger(0);
@RequestMapping("/test")
public String test() {
a.getAndAdd(1);
System.out.println("a.get():" + a.get());
if (a.get() % 2 == 1) {
Thread t = new Thread(() -> {
try {
TimeUnit.MINUTES.sleep(5);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
t.start();
System.out.printf("线程: %s 将被阻塞\n", Thread.currentThread().getName());
try {
t.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
System.out.printf("线程: %s 提供响应\n", Thread.currentThread().getName());
System.out.println("a.get():" + a.get());
return "1";
}
}
在命令行中多次运行,进行测试,
C:\Users\Administrator>curl http://127.0.0.1:8080/test
奇数次请求被阻塞,偶数次请求得到响应,服务端控制台输出如下
a.get():1
线程: http-nio-8080-exec-1 将被阻塞
a.get():2
线程: http-nio-8080-exec-2 提供响应
a.get():2
a.get():3
线程: http-nio-8080-exec-3 将被阻塞
a.get():4
线程: http-nio-8080-exec-4 提供响应
a.get():4
a.get():5
线程: http-nio-8080-exec-5 将被阻塞
a.get():6
线程: http-nio-8080-exec-6 提供响应
a.get():6
a.get():7
线程: http-nio-8080-exec-7 将被阻塞
a.get():8
线程: http-nio-8080-exec-8 提供响应
a.get():8
a.get():9
线程: http-nio-8080-exec-9 将被阻塞
a.get():10
线程: http-nio-8080-exec-10 提供响应
a.get():10
所以 bean 只是被线程调用,只要 bean 没有锁,是不影响并发的,那就是可以考虑通过提高“http-nio-8080-exec-*”代表的线程的数量来提高并发响应能力。