“Spring Boot 思考”的版本间的差异
跳到导航
跳到搜索
Jihongchang(讨论 | 贡献) (建立内容为“1”的新页面) |
Jihongchang(讨论 | 贡献) |
||
(未显示同一用户的1个中间版本) | |||
第1行: | 第1行: | ||
− | 1 | + | Spring Boot 中的 bean 默认都是 singleton(单例模式),就是说一个 bean 只有一个对象; |
+ | |||
+ | 如果改成 prototype(原型),能提高并发处理能力吗? | ||
+ | |||
+ | 测试:新建一个 web 项目,在这个项目中新建一个 RestController,代码如下<syntaxhighlight lang="java"> | ||
+ | @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"; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </syntaxhighlight>在命令行中多次运行,进行测试,<syntaxhighlight lang="powershell"> | ||
+ | C:\Users\Administrator>curl http://127.0.0.1:8080/test | ||
+ | </syntaxhighlight>奇数次请求被阻塞,偶数次请求得到响应,服务端控制台输出如下<syntaxhighlight lang="console"> | ||
+ | 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 | ||
+ | </syntaxhighlight>所以 bean 只是被线程调用,只要 bean 没有锁,是不影响并发的,那就是可以考虑通过提高“http-nio-8080-exec-*”代表的线程的数量来提高并发响应能力。 |
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-*”代表的线程的数量来提高并发响应能力。