servlet中的并发

Servlet设计为单例多线程,一个servlet实例对应一个线程池,请求通过调度器分配线程执行service方法。并发执行可能导致线程不安全,如数据一致性问题。解决方案包括使用局部变量、同步锁,避免实现singleThreadModel接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个servlet只有一个实例,简单来说就是为了节省内存,servlet的设计非常的巧妙,如果我们对每一个用户请求都生成一个对应servlet的一个对象,第一、由于web服务器的访问量比较大,意味着内存开销会很大

servlet实例对应一个线程池,每当有一个请求到来时,就会选择其中的一个线程,执行service方法,若多个请求都选中同一个线程,则请求排队


(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的线程状态,这个时候就会出现数据不一致的情况。


对于并发中的安全性的解决:

1.尽量的使用本地变量,少或者不适用全局变量

2.使用同步锁

3。让servlet实现singleThreadModel接口的方式还是不要了,因为对每一个请求都新建一个servlet实例的方式太low了把

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值