“Spring Boot 思考”的版本间的差异

来自姬鸿昌的知识库
跳到导航 跳到搜索
(建立内容为“1”的新页面)
 
 
(未显示同一用户的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-*”代表的线程的数量来提高并发响应能力。