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 要多使用局部变量。
所以你的项目中如果只有一个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 要多使用局部变量。