Spring Boot 思考

来自姬鸿昌的知识库
Jihongchang讨论 | 贡献2023年2月20日 (一) 12:20的版本
跳到导航 跳到搜索

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