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对象池的更多相关文章

  1. tomcat中Servlet的工作机制

    在研究Servlet在tomcat中的工作机制前必须先看看Servlet规范的一些重要的相关规定,规范提供了一个Servlet接口,接口中包含的重要方法是init.service.destroy等方法 ...

  2. Java中的对象池技术

    java中的对象池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复重复创建相等变量时节省了很多时间.对象池其实也就是一个内存 ...

  3. Unity编程标准导引-3.4 Unity中的对象池

    本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan Unity编程标准导引-3.4 Unity中的对象池 本节通过一个简单的射击子弹的示例来介绍T ...

  4. Java 中的对象池实现

    点赞再看,动力无限.Hello world : ) 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. 最近在 ...

  5. 在Tomcat中配置连接池和数据源

    1.DataSource接口介绍 (1)DataSource 概述 JDBC1.0原来是用DriverManager类来产生一个对数据源的连接.JDBC2.0用一种替代的方法,使用DataSource ...

  6. 深入了解tomcat中servlet的创建方式实现

    Tomcat如何创建Servlet? A.先到缓存中寻找有没有这个对象(Servlet是单实例的,只会创建一次) 如果没有: 1.通过反射去创建相应的对象(执行构造方法) 2.tomcat会把对象存放 ...

  7. .net core中的对象池

    asp.net core中通过扩展库的方式提供给了一个标准的对象池ObjectPool,定义在Microsoft.Extensions.ObjectPool.dll 程序集中.它本身是个纯虚的抽象类, ...

  8. GameObjectPool——Unity中的对象池

    这里介绍一种对象池的写法.它的优点在于无论取出还是插入游戏物体都是常数量时间. using UnityEngine; using System.Collections; using System.Co ...

  9. Egret中的对象池ObjectPool

    为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 对象池具体含义作用,自行百度. 一 对象池A 二 对象池B 三 字符串key和对象key的效率 一 对象池A /** * 对 ...

随机推荐

  1. poj 3525 凸多边形多大内切圆

    Most Distant Point from the Sea Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4758   ...

  2. python2.7练习小例子(三)

        3):题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?     程序分析:假设该数为 x.1.则:x + 100 = n2, x + 100 + ...

  3. Weekly Contest 75题解

    Q1. Rotate String(796) We are given two strings, A and B. A shift on A consists of taking string A a ...

  4. 索引法则--LIKE以%开头会导致索引失效进而转向全表扫描(使用覆盖索引解决)

    Mysql 系列文章主页 =============== 1 准备数据 1.1 建表 DROP TABLE IF EXISTS staff; CREATE TABLE IF NOT EXISTS st ...

  5. jquery easyui datagrid 设置设置在选中的所有行中只选择第一行

    var row = $('#dg').datagrid('getSelected'); if ($('#dg').datagrid('getChecked').length > 1) { //将 ...

  6. 在Spring Boot中使用Spring Security实现权限控制

    丢代码地址 https://gitee.com/a247292980/spring-security 再丢pom.xml <properties> <project.build.so ...

  7. 基于Windows服务器,从0开始搭建一个基于RTSP协议的直播平台

    作案工具下载 EasyDarwin 服务端程序,用来接受推流和拉流 FFmpeg 可以用来推流视频数据到服务端,也可以从服务端拉流下来播放,也可以从一个服务端拉流下来,转推到另一个服务端去. Easy ...

  8. COCO 数据集的使用

    Windows 10 编译 Pycocotools 踩坑记 COCO数据库简介 微软发布的COCO数据库, 除了图片以外还提供物体检测, 分割(segmentation)和对图像的语义文本描述信息. ...

  9. IPFS星际文件系统

    IPFS星际文件系统(InterPlanetary File System)是去中心化文件系统,本文介绍IPFS节点软件系统安装,环境搭建等简介入门教程,及学习如何使用ipfs-api和Node.js ...

  10. 剑指架构师系列-MySQL常用SQL语句

    (1)分清HAVING与WHERE的区别: HAVING 子句使你能够指定过滤条件,从而控制查询结果中哪些组可以出现在最终结果里面.WHERE 子句对被选择的列施加条件,而 HAVING 子句则对 G ...