1.线程安全问题
SpringBean默认情况下都为单例,如controller,service,但Controller在实际使用中一定是并发访问的,这就涉及线程安全问题。
是否会出现线程安全问题要分两种情况:
一:controller中没有成员变量,或者有成员变量但是是无状态的。
如果没有成员变量,虽然是多线程去操作controller这个单例,但是都只是调用其方法,而方法在调用时开辟的内存空间在虚拟机栈,栈空间是线程私有的,不会出现线程安全问题。
如果有成员变量,但是是无状态的,比如注入controller的service。(无状态既是类中只有方法,虽然service中可能有被注入的mapper,但mapper中是只有方法的,所以最终没有可改写的具体值,还是无状态。)那么等同于没有成员变量。
二:controller或service中有成员变量
一般情况下,不要给这些类中增加成员变量,可以通过方法传参的方式传入操作数。但如果必须有成员变量,就要考虑解决线程安全问题。
1:在controller类中,使用@Scope(“prototype”)注解,变为多例,。
@RestController
@Scope("prototype")
public class UserController {
...}
2:使用Threadlocal构建成员变量。
ThreadLocal<Integer> t=new ThreadLocal<>();
//在方法中使用时再从ThreadLocal获取
void method(){
Integer i=t.get();
}