servlet单实例多线程时的线程安全
2013-10-30 11:12
246 查看
1、初始化阶段,init方法:负责初始化Servlet对象。
2、提供服务,service方法:负责响应客户的请求。
3、销毁,destroy方法:当Servlet对象退出生命周期时,负责释放占用的资源。
非线程安全是指多线程操作同一个对象可能会出现问题。而线程安全则是多线程操作同一个对象不会有问题。
servlet不是线程安全的,因为servlet只有一个实例,当有多个请求时,会有该实例的多个线程,而servlet的service等方法没有用synchoronized等同步手段来同步,所以servlet不是线程安全的。
当第一个用户访问web用户时,servlet实例化。此后有用户访问,web容器均为其创建一个单独的线程来处理用户请求。此时便涉及到线程同步的问题。
解决线程同步的方法有:
1.继承SingleThreadModel接口。
对于不同的容器商对SingleThreadModel的实现不同,分为:
1)对所有的请求排队,一个一个的响应。
2)新建servlet的多个实例,以实例池的方式,对外提供服务。
采用这种方法会使系统的性能大受影响,比较慢。
2.对service方法里面的代码块进行同步。
public void service(HttpServletRequest request, HttpServletResponse response){
Synchronized(this){
.............
}
}
3.不使用实例变量,使用局部变量。
1) 实例变量时在堆上分配的,为所有线程共享,所以不是线程安全的
2)局部变量在栈上分配,由于每个线程都有自己的的执行堆栈,所以是局部安全的
相关文章推荐
- 基于一个应用程序多线程误用的分析详解
- 浅解关于C#多线程的介绍
- 批处理程序中的“多线程”处理代码
- 小试JavaScript多线程第1/2页
- JavaScript多线程的实现方法
- Servlet与JSP间的两种传值情况
- android 多线程技术应用
- java多线程应用实现方法
- jsp和servlet的区别探讨
- JavaScript是否可实现多线程 深入理解JavaScript定时机制
- Struts2访问servlet分享
- java中Servlet处理乱码的方法
- Android多线程及异步处理问题详细探讨
- Python代理抓取并验证使用多线程实现
- Python多线程学习资料
- Servlet 过滤器详细介绍
- 基于Java回顾之多线程详解
- 深入多线程之:Reader与Write Locks(读写锁)的使用详解
- c#实现用SQL池,多线程定时批量执行SQL语句的方法
- 一些.NET对多线程异常处理技巧分享