Servlet

1、什么是Servlet

Servlet就是一个java类;继承自httpServlet;在服务器端运行,用以处理客户端的信息。

2、Servlet生命周期

Servlet生命周期是指Servlet实例后,存在时间以及何时销毁的真个过程;

----实例化:Servlet容器创建Servlet实例
----初始化:调用init()方法
----服务:如果有请求,调用service()方法
----销毁:销毁实例前调用destroy()方法
----垃圾收集:销毁实例

3、如何开发线程安全的Servlet

1)变量的线程安全:这里的变量指字段和共享数据(如表单参数值)

a、将 参数变量 本地化。多线程并不共享局部变量.所以我们要尽可能的在servlet中使用局部变量

b、使用同步块Synchronized,防止可能异步调用的代码块。这意味着线程需要排队处理

2)属性的线程安全:ServletContext,HttpSession,ServletRequest对象中属性

ServletContext:(线程是不安全的)

HttpSession:(线程是不安全的)

ServletRequest:(线程是安全的)

3)使用同步的集合类

使用Vector代替ArrayList,使用Hashtable代替HashMap

4)不要在Servlet中创建自己的线程来完成某个功能

Servlet本身就是多线程的,在Servlet中再创建线程,将导致执行情况复杂化,出现多线程安全问题。

5)在多个servlet中对外部对象(比方文件)进行修改操作一定要加锁,做到互斥的访问。

6)javax.servlet.SingleThreadModel接口是一个标识接口,如果一个Servlet实现了这个接口,那Servlet容器将保证在一个时刻仅有一个线程可以在给定的servlet实例的service方法中执行。将其他所有请求进行排队

SingleThreadModel接口在servlet规范中已经被废弃了,可以不考虑

小结

Servlet的线程安全问题只有在大量的并发访问时才会显现出来,并且很难发现,因此在编写Servlet程序时要特别注意。线程安全问题主要是由实例变量造成的,因此在Servlet中应避免使用实例变量。如果应用程序设计无法避免使用实例变量,那么使用同步来保护要使用的实例变量,但为保证系统的最佳性能,应该同步可用性最小的代码路径。


原文链接 http://blog.csdn.net/zljjava/article/details/6887266

 

posted @ 2015-07-13 17:18  喝酒骑驴撞城管  阅读(84)  评论(0编辑  收藏  举报