一,Servlet容器如何同时处理多个请求。
Servlet采用多线程来处理多个请求同时访问,Servelet容器维护了一个线程池来服务请求。
线程池实际上是等待执行代码的一组线程叫做工作者线程(WorkerThread),Servlet容器使用一个调度线程来管理工作者线程(DispatcherThread)。
当容器收到一个访问Servlet的请求,调度者线程从线程池中选出一个工作者线程,将请求传递给该线程,然后由该线程来执行Servlet的service方法。
当这个线程正在执行的时候,容器收到另外一个请求,调度者线程将从池中选出另外一个工作者线程来服务新的请求,容器并不关系这个请求是否访问的是同一个Servlet还是另外一个Servlet。
当容器同时收到对同一Servlet的多个请求,那这个Servlet的service方法将在多线程中并发的执行。
二,Servlet容器默认采用单实例多线程的方式来处理请求,这样减少产生Servlet实例的开销,提升了对请求的响应时间。对于Tomcat可以在server.xml中通过<Connector>元素设置线程池中线程的数目。
就实现来说:
调度者线程类所担负的责任如其名字,该类的责任是调度线程,只需要利用自己的属性完成自己的责任。所以该类是承担了责任的,并且该类的责任又集中到唯一的单体对象中。
而其他对象又依赖于该特定对象所承担的责任,我们就需要得到该特定对象。那该类就是一个单例模式的实现了。
三,如何开发线程安全的Servlet
1,变量的线程安全:这里的变量指字段和共享数据(如表单参数值)。
a,将参数变量本地化。多线程并不共享局部变量.所以我们要尽可能的在servlet中使用局部变量。
例如:Stringuser=""; user=request.getParameter("user");
b,使用同步块Synchronized,防止可能异步调用的代码块。这意味着线程需要排队处理。
在使用同板块的时候要尽可能的缩小同步代码的范围,不要直接在sevice方法和响应方法上使用同步,这样会严重影响性能。
2,属性的线程安全:ServletContext,HttpSession,ServletRequest对象中属性
ServletContext:(线程是不安全的)
ServletContext是可以多线程同时读/写属性的,线程是不安全的。要对属性的读写进行同步处理或者进行深度Clone()。
所以在Servlet上下文中尽可能少量保存会被修改(写)的数据,可以采取其他方式在多个Servlet中共享,比方我们可以使用单例模式来处理共享数据。
HttpSession:(线程是不安全的)
HttpSession对象在用户会话期间存在,只能在处理属于同一个Session的请求的线程中被访问,因此Session对象的属性访问理论上是线程安全的。
当用户打开多个同属于一个进程的浏览器窗口,在这些窗口的访问属于同一个Session,会出现多次请求,需要多个工作线程来处理请求,可能造成同时多线程读写属性。
这时我们需要对属性的读写进行同步处理:使用同步块Synchronized和使用读/写器来解决。
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实例组成的实例池,对于每个请求分配Servlet实例进行响应处理,之后放回到实例池中等待下此请求。这样就造成并发访问的问题。
此时,局部变量(字段)也是安全的,但对于全局变量和共享数据是不安全的,需要进行同步处理。而对于这样多实例的情况SingleThreadModel接口并不能解决并发访问问题。
SingleThreadModel接口在servlet规范中已经被废弃了。
分享到:
相关推荐
base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz
在IT领域,网络编程是不可或缺的一部分,而TCP(Transmission Control Protocol)作为一种面向连接的、可靠的传输...在实际开发中,还需要注意线程安全、线程池的使用以及资源管理等问题,以确保服务器的稳定性和效率。
ZZ公司的安全生产守则是为了保障公司生产建设的正常运行,强调各级员工对安全生产重要性的认知,遵循科学管理和法制观念。这份守则包含以下关键知识点: 1. **安全生产的重要性**:安全生产被视为企业的首要任务,...
**Qt多线程基础** Qt库提供了一套强大的多线程机制,允许开发者在应用程序中同时执行多个任务,提高程序的响应性和效率。在给定的"Qt多线程简单实例"中,我们关注的核心是如何创建和管理线程,以及如何通过用户交互...
本份文档是一份关于全国职业院校技能大赛中的一项赛项规程的文件,具体为网络安全赛项,编号为ZZ-2021029。这一赛项旨在检验中职学校网络信息安全专业的教学成效,并促进该专业的教学改革。同时,通过大赛培养符合...
这涉及到多个层面的安全策略,包括登录和密码策略、数据库安全策略、流量完整性保护策略、事件监控策略和防火墙策略。选手需提供操作截图和文字说明,并以PDF格式提交。 【任务详解】 A-1 任务一:登录安全加固 1...
非常感谢您对ZZ的信任。信任就像一道桥梁,将您和ZZ... 为此,ZZ工作室为确保大家的隐私不被泄露,让电脑更安全,从而研发了ZZ安全盾甲安全软件,无时无刻保护着您的电脑不受侵害。ZZ安全盾甲将拼了命的保护您的电脑。
网络安全赛项赛题 中职赛项 适合正在准备技能大赛的人群
zz中职网络安全逆向题目
访问路径为:http://localhost:8080/web001/test.do?flag=xxyyzz&switch=off 其中switch开关参数取值有两种:on和off,on表示执行线程对应的任务,off表示中断线程正在执行的任务。
- **线程同步**:为了防止多个线程同时访问共享资源导致的问题,可以使用锁(Lock)等机制来实现线程间的同步。 ### 二、枚举获取WiFi信息 #### 1. 枚举概念 枚举是一种数据类型,它包含一组预定义的值。在这里,...
zz吉林省食品安全企业标准审查意见表.pdf
ZZ561401.CAB ZZ561401.CAB ZZ561401.CAB
2021zz网络安全重庆市赛
在JSF框架中,Servlet容器扮演着中间人的角色,将用户的请求转发给适当的组件或Bean,并将结果返回给用户。 ##### 8. **Web应用程序** Web应用程序是指由JSF框架构建的整个应用系统。它包含了所有必要的组件、资源...
在CAD中想要快速测量长度,在CAD工具栏找到加载应用程序,再点击加载 加载成功后在输入栏输入“zz”(不分大小写)在选择你需要测量的线段即可。
wincc SIMATIC WinCC是第一个使用最新的32位技术的过程监视系统,具有良好的开放性和灵活性。 从面市伊始,用户就对SIMATIC WinCC印象深刻。
总的来说,“zz-doctor”作为一个中医信息化的Android应用,其背后涵盖了Android应用开发的全貌,包括基本组件的使用、UI设计、数据管理、网络通信等多个方面。对于想要学习或提升Android开发技能的人员来说,深入...
ZZ-2021030 网络搭建与应用赛项赛卷-网络搭建及安全部署竞赛报告单
我们研究了四轻子最终状态ℓ+ℓ-ℓ+ℓ-的产生,这些状态主要由一对弱电Z玻色子ZZ产生。 使用LoopSim方法,我们合并ZZ和ZZ + jet的NLO QCD结果,并获得ZZ产生的近似NNLO预测。 还包括对ZZ过程的精确胶子融合环平方的...