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

本文章转载于:http://blog.csdn.net/zly9923218/article/details/51125881

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”%>来实现单线程。

当你需要保证数据一致性的时候,必须自己处理线程安全问题时可以考虑单线程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值