一,servlet容器如何同时处理多个请求。
Servlet采用多线程来处理多个请求同时访问,Servlet容器维护了一个线程池来服务请求。
线程池实际上是等待执行处理的一组线程,也叫做工作者线程(Worker Thread),
Servlet容器使用一个调度线程来管理工作者线程(Dispatcher Thread)。
当容器收到一个访问Servlet的请求,调度者线程从线程池中选出一个工作者线程,将请求传递给该线程,
然后由该线程来执行Servlet的service方法。
当这个线程正在执行的时候,容器收到另外一个请求,调度者线程将从池中选出另外一个工作者线程来服务新的请求;
容器并不关心这个请求是否访问的是同一个Servlet还是另外一个Servlet;
当容器同时收到对同一Servlet的多个请求,那这个Servlet的service方法将以多线程方式并发执行。
二,Servlet容器默认采用单实例多线程的方式来处理请求,减少产生Servlet实例的开销,提升了对请求的响应。
对于Tomcat可以在server.xml中通过<Connector>元素设置线程池中线程的数目。
就实现来说:
调度者线程类所担负的责任是调度线程,只需要利用自己的属性完成自己的责任。
而其他对象又依赖于该对象所承担的责任,需要得到该特定对象,那该类就是一个单例模式的实现了。
三,如何开发线程安全的Servlet
1,变量的线程安全:这里的变量指字段和共享数据(如表单参数值)。
a,将参数变量本地化:多线程并不共享局部变量.所以我们要尽可能的在servlet中使用局部变量。
例如:String user = request.getParameter("user");
b,使用同步块Synchronized,防止可能异步调用的代码块。这意味着线程需要队列处理。
在使用同板块的时候要尽可能的缩小同步代码的范围,不要直接在sevice方法和响应方法上使用同步,这样会严重影响性能。
2,属性的线程安全分析:ServletContext,HttpSession,ServletRequest对象的属性
ServletContext:(线程是不安全的)
ServletContext是可以多线程同时读/写属性的,线程是不安全的。要对属性的读写进行同步处理或者进行深度Clone()。
所以在Servlet上下文中尽可能少地保存频繁改写的数据,可以采取其他方式在多个Servlet中共享,比方我们可以使用单例模式来处理共享数据。
HttpSession:(线程是不安全的)
HttpSession对象在用户会话期存在,只能处理属于同一个Session的请求的线程,因此Session对象的属性访问理论上是线程安全的。
当用户打开多个同属于一个进程的浏览器窗口,在这些窗口的访问属于同一个Session,会出现多次请求,需要多个工作线程来处理请求,可能造成同时多线程读写属性,这时我们对属性的读写进行同步处理。
ServletRequest:(线程是安全的)
对于每一个请求,由一个工作线程来执行,都会创建有一个新的ServletRequest对象,所以ServletRequest对象只能在一个线程中被访问。ServletRequest是线程安全的。
注意:ServletRequest对象在service方法的范围内是有效的,不要试图在service方法结束后仍然保存请求对象的引用。
3,使用同步的集合类:
使用Vector代替ArrayList,使用Hashtable代替HashMap。
4,不要在Servlet中创建自己的线程来完成某个功能:
Servlet本身就是多线程的,在Servlet中再创建线程,将导致执行情况复杂化,出现安全问题。
5,在多个servlet中,对外部对象(例如文件)进行修改操作一定要加锁,做到互斥的访问
四,SingleThreadModel接口
javax.servlet.SingleThreadModel接口是一个标识接口,如果一个Servlet实现了这个接口,
则Servlet容器将保证在同时刻仅有一个线程可以在该servlet实例的service方法中执行,将其他所有请求进行排队。
服务器可以使用多个实例来处理请求,代替单个实例的请求排队带来的性能问题。
服务器可创建一个Servlet类的多个实例组成的实例池,对于每个请求分配Servlet实例进行响应,之后放回到实例池中等待下此请求。此时,局部变量(字段)也是安全的,但对于全局变量和共享数据是不安全的,需要进行同步处理。
而对于这种多实例的情况,使用SingleThreadModel接口并不能解决并发访问产生的问题,
且SingleThreadModel接口在servlet规范中已经被明确声明为deprecated了。
分享到:
相关推荐
基于多线程Java程序安全行为模型的静态检查对策探析 本文主要讨论基于多线程Java程序安全行为模型的静态检查对策探析,通过参数化扩展上下文无关文法作为安全相关行为模型的抽象表示,总结出了从多线程Java程序自动...
### 基于Java多线程机制的探析 #### 摘要 本文深入探讨了Java多线程机制的基本原理及其应用场景。首先简要分析了Java多线程的概念及其实现方法,随后详细介绍了多线程在多用户远程协同工作系统中的应用,特别是...
《电子商务论文之安全问题探析》一文深入探讨了电子商务领域内的重要议题——安全问题,这一议题不仅是学术界的研究焦点,也是业界实践的关键所在。文章首先明确了电子商务安全问题的紧迫性和重要性,随后分门别类地...
探析电力系统信息化安全技术.pdf
网络安全治理的三个基本问题探析.pdf
云计算环境下的网络信息安全问题探析.pdf
网络安全问题产生的原因众多,主要包括以下几个方面:首先,虽然青少年具备一定的网络知识和经验,但由于涉世未深,缺乏必要的社会经验和防范意识,导致在面对网络诈骗等安全威胁时无法有效识别和防范。其次,从家庭...
探析IPv6网络安全接入问题.pdf
信息化管理视角下中职校园网络信息安全问题探析-论文.zip
探析通信网络安全问题.pdf
我国未成年人网络安全保护法律规制问题探析.pdf
探析大数据时代计算机网络安全维护与管理措施 (1).pdf
通讯网络安全分析及其安全防御方法探析.pdf
探析计算机网络信息安全问题及防护策略.pdf
在大数据视域下,计算机信息安全技术的探析成为了一个极为关键的话题。随着信息技术的迅猛发展,我们已经迈入了大数据时代,这一时代的特点是数据量庞大、类型多样、更新迅速,而信息的安全性问题也随之日益凸显。...
中国网络安全集成服务基础能力探析 一、行业现状与发展前景 中国网络安全行业目前正处于起步阶段,总需求逐年提升,市场结构也在从安全产品转向服务型市场。受合规需求、云安全需求以及新的安全理念等因素推动,...
电子商务安全问题探析.docx
探析现代通信网络安全防护技术问题.pdf
网络安全与防火墙技术探析.pdf
安全风险视域下的云平台责任界定与治理探析.docx安全风险视域下的云平台责任界定与治理探析.docx安全风险视域下的云平台责任界定与治理探析.docx安全风险视域下的云平台责任界定与治理探析.docx安全风险视域下的云...