您的位置:首页 > 理论基础 > 计算机网络

servlet、spring mvc、struts2 、play的http请求处理

2017-10-17 14:07 260 查看
servlet: serlvet是单例多线程的,里面有一个线程池,针对每次请求会分配一个线程去处理请求。

spring mvc:
默认是用一个Controller处理所有请求,优点是不用每次创建一个Controller,减少了对象创建和垃圾收集的时间。如果Controller中定义了实例变量,就会存在并发线程的安全性问题,所以我们最好避免在controller中定义实例变量。如果非要controller中定义实例变量的话,可以在spring的配置文件中将作用域scope从singleton改成prototype,这样在每次请求的时候都会创建一个新的controller。或者直接使用ThreadLocal变量,ThreadLocal能保证变量在各个线程间是独立存在的,不会相互干扰,内部存储是一个k/v,将当前线程作为key,存储对象作为value存储。保证每个线程操作自己独立的变量。避免发生窜数据的问题。

structs2 :
每次请求都会创建一个Action对象,所以相比struts1只在第一次请求时创建Action实例,以后每次相同的请求将直接从内存中读取,同servlet一样是struts1是单例、线程不安全的,structs2是线程安全的。

play : play是最近接触的一个框架,play框架处理多个请求时会复用一个线程(dev模式下只有一个线程处理所以请求,线上的线程个数一般和cpu核数相等)。所以在ation中使用同步锁时,不仅会锁住添加同步锁的action,同个controller下的action也会被阻塞,但是play有提供await方法,我们可以将需要锁住处理的部分另开一个线程处理,使用await将本次请求先挂起一定的时间,保持连接,本次请求的执行会暂时移出线程池,到时间再恢复现场,继续执行。如此线程不会被阻塞,这样就能继续处理其他请求。如果感兴趣的话推荐可以到这看看:play框架http异步处理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐