springmvc 是基于servlet的研发-- 继承frameworkServlet ;
那么spring是基于方法的拦截。
spring的contorller,默认配置是单例,其中注入的service和dao也是单例。
那么我们通常认为是contorller是线程不安全的。认为spring线程安不安全,得先知道什么是线程安全?
网上有这样一个答案:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么这个类就是线程安全的。
那么我们可以发现有2个问题:
1.contorller中出现了公共的非final变量,不同线程交替赋值;
2.单例模式中并发时,对一个东西的并发实例化。
使用spring时我们应该尽量避免在contorller里使用变量。
contorller会在容器启动的时候实例化contorller,注入的对象我们也尽量不要懒加载。那么线程的安全问题得到解决。
一个http请求是一个独立的线程,当访问打容器时会创建request对象,隐藏获取到的request也不同的。
当然如果有需要特殊情况,可以修改contorller的默认属性@Scope("prototype")。这样没错访问都会重新创建contorller增加系统开销。