Spring的Controller是单例 怎么保证并发的安全

 

controller默认是单例的,不要使用非静态的成员变量,否则会发生数据逻辑混乱。正因为单例所以不是线程安全的。

 

验证示例:

复制代码
@Controller
public class HelloController {

    private int num = 0;

    @GetMapping(value = "/testScope")
    @ResponseBody
    public void testScope() {
        System.out.println(++num);
    }

    @GetMapping(value = "/testScope2")
    @ResponseBody
    public void testScope2() {
        System.out.println(++num);
    }

}
复制代码

首先访问 http://localhost:8081/testScope,得到的是1
然后再访问 http://localhost:8081/testScope2,得到的是 2

得到的不同的值,这是线程不安全的。

 

controller增加作用多例 @Scope("prototype")

复制代码
@Controller
@Scope("prototype")
public class HelloController { private int num = 0; @GetMapping(value = "/testScope") @ResponseBody public void testScope() { System.out.println(++num); } @GetMapping(value = "/testScope2") @ResponseBody public void testScope2() { System.out.println(++num); } }
复制代码

 

首先访问 http://localhost:8081/testScope,得到的是1
然后再访问 http://localhost:8081/testScope2,得到的是 2

 

单例是不安全的,会导致属性重复使用。

解决方案

1、不要在controller中定义成员变量。
2、万一必须要定义一个非静态成员变量时候,则通过注解@Scope(“prototype”),将其设置为多例模式。
3、在Controller中使用ThreadLocal变量

 

文章来源:https://blog.csdn.net/riemann_/article/details/97698560

 

posted @   草木物语  阅读(1151)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示