servlet是线程安全的吗

servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,
所以你的项目中如果只有一个servlet,那么web容器就只会创建一个实例。

默认非线程安全,如果需要线程安全需要指明。
每个servlet都只被实例化一次,每个调用都是servlet的同一个实例,并且对类变量没有线程安全

Servlet线程安全问题主要由于实例变量使用不当而引起。
Servlet体系结构是建立Java多线程机制之上的。它的生命周期是由Web容器负责的。当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件
实例化这个Servlet类。当有新客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多线程在使用这个实例。

如何实现线性安全:
1,不要在Servlet中使用实例变量是最简单的方法了。
2,另外Servlet共享访问的对象要保证是线程安全的,否则就要自己同步(共享方法中加同步关键字:synchronized)了。
3,实现单线程模式(SingleThreadModel)接口
该接口指定了系统如何处理对同一个Servlet的调用。如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法将不会有两个线程被同时执行,
当然也就不存在线程安全的问题。这种方法只要继承这个接口就行了
1.public class XXXXX extends HttpServlet implements SingleThreadModel {  2.…………  3.} 


由于struts1的本质是actionServlet,
Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action。
struts2会为每一个请求都产生一个实例,所以没是线程安全的问题。
struts2本身就是多实例单线程的,所以可以说 本身就是线程安全的。
struts1则是单实例多线程的,所以必须要注意线程的安全性。
struts1 要多使用局部变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值