Servlet是单例多线程
struts2每次处理一个请求,struts2就会实例化一个对象,这样就不会有线程安全的问题了。Struts2 是线程安全的,当然前提情况是,Action 不交给 spring管理,并且不设置为单例。
Spring mvc 线程不安全的原因
请求时多线程请求的,但是每次请求过来调用的Controller对象都是一个,而不是一个请求过来就创建一个controller对象
原因就在于如果这个controller对象是单例的,那么如果不小心在类中定义了类变量,那么这个类变量是被所有请求共享的,
这可能会造成多个请求修改该变量的值,出现与预期结果不符合的异常
在单例的情况下 相当于所有类变量对于每次请求都是共享的,每一次请求对类变量的修改都是有效的
那有没有办法让controller不以单例而以每次请求都重新创建的形式存在呢?答案是当然可以,只需要在类上添加注解@Scope("prototype")即可,这样每次请求调用的类都是重新生成的(每次生成会影响效率)还有其他方法么?答案是肯定的!使用ThreadLocal 来保存类变量,将类变量保存在线程的变量域中,让不同的请求隔离开来
注:servlet Struts1 SpringMvc 是线程不安全的,当然如果你不使用实例变量也就不存在线程安全的问题了。