servlet线程安全
来源:互联网 发布:中国地缘政治知乎 编辑:程序博客网 时间:2024/06/05 13:32
Servlet的线程安全问题
servlet运行机制:当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类,
当有新的客户端请求该Servlet时,Servlet容器会自动使用线程池等技术来处理客户端的请求,这样就会有线程安全的问题
三种解决方案:
第一种:实现 SingleThreadModel 接口
Servlet中的service方法将不会有两个线程被同时执行(概要)
缺点:会话属性和静态变量仍然可以被多线程的多请求同时访问,即便使用了SingleThreadModel servlet
第二种:同步对共享数据的操作
通过同步块操作来保证线程的安全,使用synchronized 来处理
第三种:避免使用实例变量
对上面的三种方法进行测试,可以表明用它们都能设计出线程安全的Servlet程序。
但是,如果一个Servlet实现了SingleThreadModel接口,Servlet引擎将为每个新的请求创建一个单独的Servlet实例,
这将引起大量的系统开销。SingleThreadModel在Servlet2.4中已不再提倡使用;
同样如果在程序中使用同步来保护要使用的共享的数据,也会使系统的性能大大下降。
这是因为被同步的代码块在同一时刻只能有一个线程执行它,使得其同时处理客户请求的吞吐量降低,
而且很多客户处于阻塞状态。另外为保证主存内容和线程的工作内存中的数据的一致性,
要频繁地刷新缓存,这也会大大地影响系统的性能。所以在实际的开发中也应避免或最小化 Servlet 中的同步代码;
在Serlet中避免使用实例变量是保证Servlet线程安全的最佳选择。
从Java 内存模型也可以知道,方法中的临时变量是在栈上分配空间,而且每个线程都有自己私有的栈空间,
servlet运行机制:当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类,
当有新的客户端请求该Servlet时,Servlet容器会自动使用线程池等技术来处理客户端的请求,这样就会有线程安全的问题
三种解决方案:
第一种:实现 SingleThreadModel 接口
Servlet中的service方法将不会有两个线程被同时执行(概要)
缺点:会话属性和静态变量仍然可以被多线程的多请求同时访问,即便使用了SingleThreadModel servlet
第二种:同步对共享数据的操作
通过同步块操作来保证线程的安全,使用synchronized 来处理
第三种:避免使用实例变量
对上面的三种方法进行测试,可以表明用它们都能设计出线程安全的Servlet程序。
但是,如果一个Servlet实现了SingleThreadModel接口,Servlet引擎将为每个新的请求创建一个单独的Servlet实例,
这将引起大量的系统开销。SingleThreadModel在Servlet2.4中已不再提倡使用;
同样如果在程序中使用同步来保护要使用的共享的数据,也会使系统的性能大大下降。
这是因为被同步的代码块在同一时刻只能有一个线程执行它,使得其同时处理客户请求的吞吐量降低,
而且很多客户处于阻塞状态。另外为保证主存内容和线程的工作内存中的数据的一致性,
要频繁地刷新缓存,这也会大大地影响系统的性能。所以在实际的开发中也应避免或最小化 Servlet 中的同步代码;
在Serlet中避免使用实例变量是保证Servlet线程安全的最佳选择。
从Java 内存模型也可以知道,方法中的临时变量是在栈上分配空间,而且每个线程都有自己私有的栈空间,
所以它们不会影响线程的安全。
连接:http://www.cnblogs.com/gw811/archive/2012/09/07/2674859.html
0 0
- Servlet 线程安全
- servlet线程安全
- servlet线程安全
- servlet线程安全
- Servlet 线程安全
- Servlet线程安全
- servlet的线程安全
- Servlet的线程安全
- Servlet线程安全
- Servlet 线程安全
- Servlet与线程安全
- servlet 线程安全
- Servlet的线程安全
- Servlet线程安全
- Servlet线程安全?不安全?
- servlet线程安全解析
- servlet线程安全
- 线程安全的servlet
- 【STL源码剖析读书笔记】【第3章】迭代器概念与traits编程技法
- 静态变量不能跨函数使用内存
- CODE CSDN使用
- 图像放缩之双立方插值
- 隐马尔可夫模型(HMM)攻略
- servlet线程安全
- 二进制原码、反码、补码详解
- Spring MVC学习及案例
- GNU工具链简介(全)
- C#网络编程
- 编程,你主动还是我主动
- 图像放缩之临近点插值
- 游承超:关于钢化膜的用户体验(20P)
- 编程导论