初识Servlet并发处理

并发处理概念

在实际开发过程中,我们开发出来的web应用都是面向很多用户的,那么用户可能同时访问我们开发的具体的servlet,比如说现在有三个客户端,服务器有一个Servlet,三个请求可能同时发到客户端而且三个请求都是访问同一个Servlet,这个时候Servlet是如何处理呢?
无非是两种处理模式:
(1)就是串行化处理,也就是说三个请求依次处理,效率低;

(2)就是并行化处理,也就是说三个请求同时处理,效率高。


线程模型

servlet到底使用哪种方式进行请求处理的呢?

我们之前学习servlet处理的流程中,一直是从宏观的层面进行学习的,下面学习servlet请求处理流程中具体的。

线程模型工作流程


(1)Servlet收到客户端的具体请求,Servlet首先会把请求发送给调度器,由调度器进行统一的请求派发,调度器会从线程池中选取一个工作主线程;

(2)调度器把请求派发给该线程,由该线程的执行servlet的service方法;

(3)这个线程正在执行的时候,servlet容器又收到另一个请求,调度器会从线程池中选取另外一个工作主线程来服务这个新的请求,容器并不关心请求访问的是同一个servlet还是另外一个servlet;

(4)容器收到同一个servlet的多个请求时,这个servlet的service方法将会在多线程中并发执行;

(5)线程使用完之后,就会把线程放回线程池中,如果说线程池中的线程都在进行服务,有新的请求,一般情况下这些请求会做排队处理,servlet容器也能配置servlet的一个最大的请求排队数量,假如超过这个数量,servlet就会拒绝相应的servlet请求。

Servlet并发处理的特点:

(1)单实例:
从servlet生命周期中可以知道,对于具体的某个servlet来说,servlet只会初始化一次,调用一次init(),也就是说,在整个servlet容器中只会有一个servlet的实例对象,不管我们有多少请求都是针对同一个servlet实例对象。
(2)多线程:
从线程的模型可以看到,请求的处理由多个工作线程来完成的,可以同时进行处理,同时处理的数量跟线程池的大小有关系。
(3)线程不安全:
servlet是单个实例,但又是多个线程共用实例对象,意味着servlet容器在多个线程访问同一个servlet的实例对象是没有默认加锁操作的,照成线程不安全,因为我们可能出现某一个线程正在修改servlet的实例状态,但是另外一个线程又需要读取servlet的线程状态,这个时候就会出现数据不一致的情况。

Servlet线程安全注意要点

(1)变量的线程安全:
--参变量本地化:也就是说尽量使用局部变量,因为多线程并不共享局部变量。
--使用同步块synchronized:就是对我们的一些代码进行加锁的处理,在做加锁处理的时候应该注意,尽可能的缩小synchronized的代码块的范围
最好是不要再service方法上增加关键字,这样会对性能的损耗比较大。
(2)属性的线程安全:
--ServletContext线程不安全:因为ServletContext是可以多线程读取它的属性,所以线程不安全,那我们在对sevletContext属性进行读写的时候,就需要注意做一些同步的处理
--HttpSession理论上线程安全:HttpSession属性是在用户会话期间存在的,那只能在处理同一个Session请求的线程中被访问,那Session对象的属性访问理论上是安全的,当用户打开多个属于同一个进程的浏览器窗口的时候,在这些窗口的访问属于同一个Session会出现多个请求,需要多个线程来进行处理,也会照成多个线程读写属性的问题,这个时候我们还会需要对Session的属性进行一个同步处理。所以是理论上的线程安全

--ServletRequst线程安全:对于每一个请求只能由一个线程进行处理,所以ServletRequst对象只能在同一个线程中被访问。
(3)避免在Servlet中创建线程
因为Servlet本身就是多线程进行处理的,如果在Servlet再创建一些线程,就会导致执行情况变得非常复杂,出现一些多线程安全的问题
(4)多个Servlet访问外部对象加锁

Servlet的线程安全问题只有在大量的并发处理分时候才会显现出来,而且很难发现,因此在写Servlet程序的时候就应该注意线程安全问题。
  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值