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 @ 2020-12-21 13:37  草木物语  阅读(1135)  评论(0编辑  收藏  举报