springmvc 线程安全的理解

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增加系统开销。

猜你喜欢

转载自www.cnblogs.com/tiandjnet/p/9258344.html
今日推荐