servlet 如何处理多请求访问以及线程讲解

SERVLET线程模型 实现javax.servlet包的SingleThreadModel接口能确保在servlet的service()方法内只运行一个线程。在多线程模型中开发servlet时,需要处理线程问题以保护对共享资源的访问。要开发线程安全的servlet,首先需要识别本质上线程安全的属性类型和需要予以保护才能确保线程安全的属性类型。此外,实现SingleThreadModel不保证对servlet中的类变量等共享资源的访问能够同步。以下代码段显示了如何同步增加计数变量中的计数变量中的计数器的setCount()方法。 阅读详情
一、Servlet如何处理多个请求访问?

Servlet容器默认是采用单实例多线程的方式处理多个请求的:
  1.当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在一个Servlet实例);
  2.容器初始化化Servlet主要就是读取配置文件(例如tomcat,可以通过servlet.xml的<Connector>设置线程池中线程数目,初始化线程池通过web.xml,初始化每个参数值等等。
  3.当请求到达时,Servlet容器通过调度线程(Dispatchaer Thread) 调度它管理下线程池中等待执行的线程(Worker Thread)给请求者;
  4.线程执行Servlet的service方法;
  5.请求结束,放回线程池,等待被调用;
(注意:避免使用实例变量(成员变量),因为如果存在成员变量,可能发生多线程同时访问该资源时,都来操作它,照成数据的不一致,因此产生线程安全问题)
从上面可以看出(好处):
  第一:Servlet单实例,减少了产生servlet的开销;
  第二:通过线程池来响应多个请求,提高了请求的响应时间;
  第三:Servlet容器并不关心到达的Servlet请求访问的是否是同一个Servlet还是另一个Servlet,直接分配给它一个新的线程;
      如果是同一个Servlet的多个请求,那么Servlet的service方法将在多线程中并发的执行;
  第四:每一个请求由ServletRequest对象来接受请求,由ServletResponse对象来响应该请求;

其中,Servlet容器如何同时来处理多个请求涉及到的概念或原理:
Java的内存模型JMM(Java Memory Model)
  JMM主要是为了规定了线程和内存之间的一些关系。根据JMM的设计,系统存在一个主内存(Main Memory),Java中所有实例变量都储存在主存中,对于所有线程都是共享的。
每条线程都有自己的工作内存(Working Memory),工作内存由缓存和堆栈两部分组成,缓存中保存的是主存中变量的拷贝,缓存可能并不总和主存同步,
也就是缓存中变量的修改可能没有立刻写到主存中;堆栈中保存的是线程的局部变量,线程之间无法相互直接访问堆栈中的变量。
根据JMM,我们可以将论文中所讨论的Servlet实例的内存模型抽象为图所示的模型。

 

工作者线程Work Thread:执行代码的一组线程。
 
调度线程Dispatcher Thread:每个线程都具有分配给它的线程优先级,线程是根据优先级调度执行的。 

Servlet采用多线程来处理多个请求同时访问。servlet依赖于一个线程池来服务请求。线程池实际上是一系列的工作者线程集合。Servlet使用一个调度线程来管理工作者线程。 

  当容器收到一个Servlet请求,调度线程从线程池中选出一个工作者线程,将请求传递给该工作者线程,然后由该线程来执行Servlet的service方法。当这个线程正在执行的时候,容器收到另外一个请求,调度线程同样从线程池中选出另一个工作者线程来服务新的请求,
容器并不关心这个请求是否访问的是同一个Servlet.当容器同时收到对同一个Servlet的多个请求的时候,那么这个Servlet的service()方法将在多线程中并发执行。 Servlet容器默认采用单实例多线程的方式来处理请求,这样减少产生Servlet实例的开销,提升了对请求的响应时间,
对于Tomcat可以在server.xml中通过<Connector>元素设置线程池中线程的数目。

  二、servlet默认是线程安全的吗?

 

  Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。

  当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例。Servlet容器会自动使用线程池等技术来支持系统的运行,如图1所示。

clip_image001

这样,当两个或多个线程同时访问同一个Servlet时,可能会发生多个线程同时访问同一资源的情况,数据可能会变得不一致。所以在用Servlet构建的Web应用时如果不注意线程安全的问题,会使所写的Servlet程序有难以发现的错误。


解决此类的方法也有多

1、实现 SingleThreadModel 接口(将引起大量的系统开销)

  该接口指定了系统如何处理对同一个Servlet的调用。如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法将不会有两个线程被同时执行,当然也就不存在线程安全的问题。这种方法只要继承这个接口就行了

  1. public class XXXXX extends HttpServlet implements SingleThreadModel {   
  2.       ......  
  3. }  

javax.servlet.SingleThreadModel API及其翻译

Ensures that servlets handle only one request at a time. This interface has no methods.

确保servlet每次只处理一项请求。接口不含方法。

If a servlet implements this interface, you are guaranteed that no two threads will execute concurrently in the servlet's service method. The servlet container can make this guarantee by synchronizing access to a single instance of the servlet, or by maintaining a pool of servlet instances and dispatching each new request to a free servlet.

如果servlet实现了该接口,会确保不会有两个线程同时执行servlet的service方法。 servlet容器通过同步化访问servlet的单实例来保证,也可以通过维持servlet的实例池,对于新的请求会分配给一个空闲的servlet。

Note that SingleThreadModel does not solve all thread safety issues. For example, session attributes and static variables can still be accessed by multiple requests on multiple threads at the same time, even when SingleThreadModel servlets are used. It is recommended that a developer take other means to resolve those issues instead of implementing this interface, such as avoiding the usage of an instance variable or synchronizing the block of the code accessing those resources. This interface is deprecated in Servlet API version 2.4.

注意:SingleThreadModel不会解决所有的线程安全隐患。 例如,会话属性和静态变量仍然可以被多线程的多请求同时访问,即便使用了SingleThreadModel servlet。建议开发人员应当采取其他手段来解决这些问题,而不是实现该接口,比如 避免实例变量的使用或者在访问资源时同步代码块。该接口在Servlet API 2.4中将不推荐使用。

2、同步对共享数据的操作:被同步的代码块在同一时刻只能有一个线程执行它,使得其同时处理客户请求的吞吐量降低,而且很多客户处于阻塞状态

使用synchronized 关键字能保证一次只有一个线程可以访问被保护的区段,在本论文中可以通过同步块操作来保证Servlet的线程安全。同步后的代码如下:

  1. Public class XXXXXX extends HttpServlet {   
  2.      ......  
  3. synchronized (this){XXXX}   
  4.   
  5. }   

3、避免使用实例变量

  线程安全问题还有些是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。

对上面的三种方法进行测试,可以表明用它们都能设计出线程安全的Servlet程序。但是,如果一个Servlet实现了SingleThreadModel接口,Servlet引擎将为每个新的请求创建一个单独的Servlet实例,这将引起大量的系统开销。SingleThreadModel在Servlet2.4中已不再提倡使用;同样如果在程序中使用同步来保护要使用的共享的数据,也会使系统的性能大大下降。这是因为被同步的代码块在同一时刻只能有一个线程执行它,使得其同时处理客户请求的吞吐量降低,而且很多客户处于阻塞状态。另外为保证主存内容和线程的工作内存中的数据的一致性,要频繁地刷新缓存,这也会大大地影响系统的性能。所以在实际的开发中也应避免或最小化Servlet 中的同步代码;在Serlet中避免使用实例变量是保证Servlet线程安全的最佳选择。从Java 内存模型也可以知道,方法中的临时变量是在栈上分配空间,而且每个线程都有自己私有的栈空间,所以它们不会影响线程的安全。

小结

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

一个servlet类处理多个请求(反射优化),简单易懂 一个servlet类处理多个请求(反射优化),通过反射将不同对象的不同请求执行对应的方法 阅读详情

相关推荐

深入理解Tomcat多线程在Servlet处理中的应用

Servlet 3.1引入了对非阻塞I/O的支持。非阻塞I/O涉及到的API主要包括以下两个接口:和。通过这些接口,Servlet可以在不阻塞当前线程的情况下,处理输入和输出。一个典型的非阻塞I/O的处理过程可能如下所示:1. 客户端向服务器发送请求。2. 服务器端的Servlet接收到请求,并注册一个,然后返回给客户端。3. Servlet继续执行其他操作,不再等待数据读取完成。4. 当数据到达时,的事件处理器被触发。5.

weixin_35972981的博客 1086

模仿Controller实现在一个Servlet中处理多个请求

/ 1、获得方法名称 String op = request . getParameter("op");// 2、通过方法名和方法所需要的参数获得Method对象 try {throw new RuntimeException("调用的方法:" + op + "不存在" , e);} // 3、通过Method对象调用方法 //调用和请求匹配的处理方法 String result = null;try {} // 如果返回的result不为空 if(result!

哈 434

servlet是如何同时处理多个请求的

本包里的三个类是模拟了tomcat是如何多线程的使用同一个servlet的实例来同时使用service方法处理请求

一个Servlet处理多个请求

普通的Servlet一个Servlet只能处理一个请求,可以仿Struts1中的DispatchAction让一个Servlet处理多个请求。 做法是: 让普通处理请求的Servlet继承父类的BaseServlet,然后让父类单独继承HttpServlet.然后再在处理请求的servlet中定义自己的处理请求的方法,但方法中必须包HttpServletRequest,HttpServletRes...

大小鱼鱼鱼鱼鱼 3126

手把手教你逆向京东搜索接口:H5ST 556位参数生成与V8补环境技巧

本文深入解析了京东搜索接口中关键的H5ST 556位参数生成机制,并提供了详细的逆向实战指南。针对其复杂的反爬虫环境检测,文章重点介绍了通过链式补环境技巧,在Node.js中完整模拟浏览器环境(包括原型链检测和指纹验证)的方法,帮助开发者成功绕过防护并生成有效参数。

weixin_29315091的博客 480

Open5GS实战:从零搭建树莓派5G核心网并与商用终端联调

本文详细介绍了如何在树莓派5上从零开始搭建基于Open5GS的5G核心网,涵盖系统准备、依赖安装、源码编译、关键配置修改及服务启动全流程。通过整合SDR基站与商用终端进行端到端联调,为开发者和研究者提供了一个低成本、可实践的5G网络实验平台,助力物联网与边缘计算应用的本地化测试与验证。

weixin_29194255的博客 157

同一个Servlet处理多请求,并实现不同业务逻辑

同一个Servlet处理多请求,并实现不同业务逻辑

weixin_44178072的博客 678

Halcon 形态学 开发案例 (开运算opening(先腐蚀再膨胀)、闭运算closing(先膨胀再腐蚀))

算子方法:功能:使用用户自定义的结构元素对区域进行开运算参数: Region(输入参数) :输入区域 StructElement(输入参数) :结构元素(区域) RegionOpening(输出参数) :开运算后的区域功能:使用圆形结构元素对区域进行开运算参数: Region(输入参数) :输入区域 RegionOpening(输出参数) :开运算后的区域 Radius(输入参数) :圆形结构元素的半径功能:使用矩形结构元素对区域进行开运算。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1618

java servlet 多线程_servlet 如何处理多请求访问以及线程讲解

一、Servlet如何处理多个请求访问?Servlet容器默认是采用单实例多线程的方式处理多个请求的:1.当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在一个Servlet实例);2.容器初始化化Servlet主要就是读取配置文件(例如tomcat,可以通过servlet.xml的设置线程池中线程数目,初始化线程池通过web.xml,初始化每个参数值等...

weixin_39799825的博客 1213

电磁阀颤振工作原理

颤振 颤振,弹性结构在均匀气(或液)流中受到空气(或液体)动力、弹性力和惯性力(见达朗伯原理)的耦合作用而发生的大幅度振动,它是气动弹性力学中最重要的问题之一。 随着机电液一体化技术的发展,电液比例控制技术的应用越来越广泛。电液比例控制系统范围较广,在液压传动与控制过程中,系统能够接受模拟信号或数字信号,使输出的流量或压力连续成比例地变化,都属于此类。该控制系统的优点是充分利用了液压控制与电气控制的长处,即功率传递靠液压,信号处理靠电气的优化措施。 电液比例控制原理与要求 液压控制系统中两个最重要的被控参数

小幽余生不加糖 1万+

【LOGO动态替换】记录一次关于LOGO动态替换引发的uboot代码分析及其实现

文章目录1.前言2.实现2.1 新增logo分区2.2 制作logo分区镜像2.2.1 查看logo.bmp和logo_kernel.bmp的文件大小。2.2.2 按规则将bmp写入logo.img3.分析3.1 uboot的启动分析3.2 uboot bmp load 显示部分3.2.1 rockchip_show_logo3.2.2 load_bmp_logo3.2.3 load_bmp_logo3.3 uboot bmp read部分3.3.1 read_logo_bmps3.3.1 read_bmp

wang 恒 的博客 1211

servlet 如何处理多请求访问以及线程讲解 很棒的文章 -- 转载

servlet 如何处理多请求访问以及线程讲解 在学习并发,请求的时候产生了疑问,再此记录下这篇好文章,制作大自然的搬运工。转载连接:https://www.cnblogs.com/GtShare/p/8033637.html 一、Servlet如何处理多个请求访问? Servlet容器默认是采用单实例多线程的方式处理多个请求的:   1.当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在一个Servlet实例);   2.容器初始化化Servlet主要就是读取配

有一颗前端心的后端开发小哥 401

【OS】AUTOSAR OS系统调用产生Trap的过程详解

AUTOSAR OS系统调用产生Trap的过程详解

qq_36056498的博客 2438

多线程访问Servlet如何谨慎处理共享资源

策略适用场景优点缺点无状态设计绝大多数情况简单高效,无需同步不适合必须共享资源的场景线程安全类共享计数器、缓存等性能高,无需手动同步功能受限同步(synchronized)临界区操作(如文件写入)灵活,可控粒度性能下降,可能死锁线程绑定资源(如数据库连接)避免竞争,资源隔离内存泄漏风险。

m0_72696598的博客 1237

vue3:html2canvas+jspdf将页面以A4导出为PDF文件,解决内容截断+在分页处截断问题详细排查和解决教程(jsPDF + html2canvas A4分页截断、内容分页时存在截断)

html2canvas + jsPDF 解决内容截断问题,vue3 jspdf-html2canvas生成多页pdf防截断处理(包含代码),vue3解决html2canvas + jsPDF导出pdf分页内容截断问题,jsPDF + html2canvas A4分页截断 完美解决方案(含代码 + 案例),html页面导出pdf截断问题,html2canvas 与 jspdf 相结合生成 pdf 内容被截断的终极解决方案,提供html2canvas+jsPDF将HTML页面以A4纸方式导出为PDF后,内容分页

✅ 精选推荐文章 2243

交换机端口模式详解:Access、Hybrid、Trunk

交换机是网络中至关重要的组件之一,用于连接各种设备并启用数据的高效流动。为了更好地管理和控制网络流量,交换机提供了不同的端口模式,其中包括Access、Hybrid和Trunk。本文将深入探讨这三种端口模式,详细解释它们的配置、特性和应用场景,以帮助网络管理员更好地理解和优化网络架构。

网络技术联盟站 4013

多用户访问servlet时,Servlet中出现的由多线程引起的问题。

public class MyClass { private String variable1 ; private static String variable2 ; public MyClass(){ } public void method(){ String variable3; } }上面是随手写的一个类,没有任何意义

薛宇凡robin 6957

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Servlet多线程安全问题

 一,servlet容器如何同时处理多个请求。Servlet采用多线程来处理多个请求同时访问,Servelet容器维护了一个线程池来服务请求。线程池实际上是等待执行代码的一组线程叫做工作者线程(Worker Thread),Servlet容器使用一个调度线程来管理工作者线程(Dispatcher Thread)。当容器收到一个访问Servlet的请求,调度者线程从线程池中选出一个工作者

自强 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Servlet的生命周期与并发处理

对于单个servlet来说,其生命周期相当简单:请求来临时,servlet容器根据请求路径匹配对应的servlet定义,调用构造函数实例化servlet。实例化之后,再调用servlet的init()方法进行初始化;如果初始化成功,就调用servlet的service()方法处理请求。请求处理完后,servlet的destroy()方法被调用。 根据API的说明,只有当servelt的init方

清箫的专栏 5917

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: 基于docker搭建mesos+zookeeper+marathon环境
下一篇: Sortable.js使用方法
flybone7
博客等级 码龄9年 58粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值