关于tomcat中Servlet对象池
来源:互联网 发布:python主流版本 编辑:程序博客网 时间:2024/05/18 22:44
Servlet在不实现SingleThreadModel的情况下运行时是以单个实例模式,如下图,这种情况下,Wrapper容器只会通过反射实例化一个Servlet对象,对应此Servlet的所有客户端请求都会共用此Servlet对象,而对于多个客户端请求tomcat会使用多线程处理,所以应该保证此Servlet对象的线程安全,多个线程不管执行顺序如何都能保证执行结果的正确性。例如刚做web应用开发时可能会犯的一个错误:在某个Servlet中使用成员变量累加去统计访问次数,这就存在线程安全问题。
为了支持一个Servlet对象对应一个线程,Servlet规范提出了一个SingleThreadModel接口,tomcat容器必须要完成的机制是:如果某个Servlet类实现了SingleThreadModel接口则要保证一个线程独占一个Servlet对象。假如线程1正在使用Servlet对象1,则线程2只能用Servlet对象2。
针对SingleThreadModel模式,tomcat的Wrapper容器使用了对象池策略,Wrapper容器会有一个Servlet堆保存若干个该Servlet对象,当需要该Servlet对象时从堆中pop一个对象,而当用完后则push回堆中。Wrapper容器中最多可以有20个该Servlet对象,例如xxxServlet类的对象池,已经有20个线程占用了20个对象,那么第21个线程执行时就会阻塞等待,直到对象池中有可用的对象才继续执行。
整个流程如下图所示,某个线程处理客户端请求,它首先尝试从Servlet对象池中获取Servlet对象,此时如果对象池有可用对象则直接返回一个对象,如果不够使用则继续实例化Servlet对象并push进对象池,但Servlet对象的总数量必须保证在20个以内,如果20个Servlet对象都被其他线程使用了,那么就必须要等到其他线程用完放回后才能获取,此时该线程会一直阻塞等待。从对象池中获取到Servlet对象后则调用Servlet对象的service方法对客户端请求进行处理,处理完后再将Servlet对象放回对象池中。
本节介绍了Servlet对象池,它是为了支持Servlet规范SingleThreadModel接口而引入的,它就是一个栈结构,需要时就pop一个对象,使用完就push回去。
- 关于tomcat中Servlet对象池
- 关于tomcat中jsp及servlet乱码问题
- 关于tomcat中jsp及servlet乱码问题
- Tomcat中关于Servlet映射器Mapper的实现
- 关于Servlet对象的生命周期
- 关于Servlet对象的生命周期
- 关于servlet的request对象
- 关于servlet的request对象
- 关于servlet中的session对象
- 关于J2EE中Servlet
- tomcat 中 /servlet url 映射
- Tomcat中Servlet的安装
- Tomcat如何与Servlet对象进行交互
- Tomcat如何与Servlet对象进行交互
- Tomcat如何与Servlet对象进行交互
- Tomcat如何与Servlet对象进行交互
- Tomcat如何与Servlet对象进行交互
- 关于在weblogic和tomcat中实现直接访问servlet的配置说明
- 打怪升级(求最大公约数)
- 扑克牌游戏(字符串操作)
- HDU-1036
- 通过Spark Streaming的window操作实战模拟热点搜索词案例实战
- ULR Web 三种路径
- 关于tomcat中Servlet对象池
- 机器学习(三) 深度学习的经典论文、代码、博客文章
- 2017网易互联网内推笔试题(奖学金问题)
- android 网文技术资料汇总
- POJ 1077(HDU 1043) Eight(八数码A*算法)
- 用户协议
- Android Studio Gradle实践之多渠道自动化打包(Android快速多渠道打包)
- ios中播放gif动画
- nutch源码分析---6