@RestController
@RequestMapping("single")
//@Scope("prototype")
public class ControllerSingle {
private int i = 1;
@GetMapping("thread1")
public Integer thread1() {
i++;
return i;
}
@GetMapping("thread2")
public Integer thread2() {
i++;
return i;
}
}
思考
1.一个用户(一个线程),调用方法1,5次,返回什么,结论:6
2.两个线程,分别调用方法1和2,5次,返回什么,结论:11
3.把注释@Scope去掉,上面两次调用返回什么,结论:都是2
为什么:没有@Scope,controller是个单例,只有一个bean对象,成员变量i,属于这个对象,线程共享,所以每次调用,不管单线程还是多线程,每次取到的都是一个bean的属性,当然是累加
如果加上注解@Scope,每次调用都会创建一个bean,就是多例的,每次拿到的对象属性都是1,返回结果都是2
参考这个兄台
Controller 是单例还是多例?怎么保证并发的安全 - 踏步 - 博客园
思考:如果项目重启,bean销毁,单例,创建bean,属性i,起始就是1,从头开始累加