severlet是单例模式还是多例模式,怎样处理线程问题?

servlet可以采用多例模式,也可以采用单利模式,百度文库有详细解释。
至于线程问题我没大明白你的意思。但在MVC模式下,一个servlet只能处理一个页面的请求,也就不存在多线程的情况,仅仅是一个页面对应一个servlet而已。等学struts框架以后会用到一个DispatchAction的抽象类,并重写一个excute的方法,利用这个方法可以将原本在servlet中的所有操作写在在一起,而servlet则只负责重定向或是请求转发。
这仅仅是我自己的理解,如果不合您意,勿怪。

追问

谢谢了,线程安全问题。

回答

关于servlet线程安全问题,网上有很多答案的,我找了个清晰的。
1、实现 SingleThreadModel 接口
 
  该接口指定了系统如何处理对同一个Servlet的调用。如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法将不会有两个线程被同时执行,当然也就不存在线程安全的问题。这种方法只要继承这个接口就行了
 
  public class XXXXX extends HttpServlet implements SingleThreadModel { ………… }
 
  2、同步对共享数据的操作
 
  使用synchronized 关键字能保证一次只有一个线程可以访问被保护的区段,在本论文中可以通过同步块操作来保证Servlet的线程安全。同步后的代码如下:
 
  Public class XXXXXX extends HttpServlet { ………… synchronized (this){XXXX} }
 
  3、避免使用实例变量
 
  线程安全问题还有些是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。
 
  对上面的三种方法进行测试,可以表明用它们都能设计出线程安全的Servlet程序。但是,如果一个Servlet实现了SingleThreadModel接口,Servlet引擎将为每个新的请求创建一个单独的Servlet实例,这将引起大量的系统开销。SingleThreadModel在Servlet2.4中已不再提倡使用;同样如果在程序中使用同步来保护要使用的共享的数据,也会使系统的性能大大下降。这是因为被同步的代码块在同一时刻只能有一个线程执行它,使得其同时处理客户请求的吞吐量降低,而且很多客户处于阻塞状态。另外为保证主存内容和线程的工作内存中的数据的一致性,要频繁地刷新缓存,这也会大大地影响系统的性能。所以在实际的开发中也应避免或最小化Servlet 中的同步代码;在Serlet中避免使用实例变量是保证Servlet线程安全的最佳选择。从Java 内存模型也可以知道,方法中的临时变量是在栈上分配空间,而且每个线程都有自己私有的栈空间,所以它们不会影响线程的安全。
  小结
  Servlet的线程安全问题只有在大量的并发访问时才会显现出来,并且很难发现,因此在编写Servlet程序时要特别注意。线程安全问题主要是由实例变量造成的,因此在Servlet中应避免使用实例变量。如果应用程序设计无法避免使用实例变量,那么使用同步来保护要使用的实例变量,但为保证系统的最佳性能,应该同步可用性最小的代码路径。

你可能感兴趣的:(java)