您的位置:首页 > 编程语言 > Java开发

Struts1,2,Servlet,Spring MVC单例多例 线程安全

2016-04-11 21:31 239 查看

Struts 1

单例,线程不安全,在请求的时候被第一次初始化

action中的service对象为何不会出现数据存储的错误,大体意思就是每一个用户发出一次请求后就有一个独立的线程与之绑定,且有一个对应的servlet实例,你在其之上做的操作只属于当前servlet实例,不会受其他servlet实例的影响,反之也不会影响其他线程的servlet实例。

Struts 2

默认多例,可以设置成单例,线程安全,但是一次不可能很多请求同时过来,那样的话tomcat直接崩溃了。

struts 2的Action中包含数据,例如你在页面填写的数据就会包含在Action的成员变量里面。如果Action是单实例的话,这些数据在多线程的环境下就会相互影响,例如造成别人填写的数据被你看到了。所以Struts2的Action是多例模式的。

Spring MVC

默认单例,可以用@Scope(“prototype”)配置成多例,单例的话线程不安全,但是spring mvc不是用action的类属性获取参数,所以没关系。

spring的单例确实存在线程安全的问题。但是spring是如何避免的呢,答案是他用了threadlocal这个类。

Servlet

怎样理解Servlet的单实例多线程

servlet单例多线程

单实例,多线程,线程安全,但是操作数据库需要加锁

servlet中的init方法只有在启动(例如web容器启动,要看loadOnStartup的设置)的时候调用,也就是只初始化一次,这就是单实例。

servlet在处理请求的时候 调用的是service方法,这个方法可以处理多个客户端的请求。

具体访问时:

JSP 在web容器中”翻译成servlet”由容器执行,web 容器本身就是提供的多线程,A,B,C 3个访问,建立3个独立的线程组,然后运行一个servlet。依次执行。

1、servlet首先不是现成线程的。

2、Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。

Servlet容器会自动使用线程池等技术来支持系统的运行

3、设定jsp:<%@ page isThreadSafe=”false”%>来实现单线程。

当你需要保证数据一致性的时候,必须自己处理线程安全问题时可以考虑单线程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: