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

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异步处理


猜你喜欢

转载自blog.csdn.net/sinat_36265222/article/details/78259790