多线程,共享HttpServeltRequest对象时候,对象丢失现象

Posted liuzhaoqing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程,共享HttpServeltRequest对象时候,对象丢失现象相关的知识,希望对你有一定的参考价值。

问题背景: web项目中一个比较复杂的查询功能,需要调用很多的底层接口,占用时间会比较多,如果用正常的用户线程,就是一个接口一个接口的调用,整的的时间会很多,因此使用多线程查询。对于每个底层都是一个一个线程查询,查询完成后,再汇总结果返回。

问题描述: 程序启动的查询接口的线程(下面成为子线程)在调用共享对象HttpServletRequest时候,有时候会报错找不到属性。有时候正常不报错。这个很奇怪,因为HttpServletRequest是在用户线程进来的时候,servlet容器自动初始化好了的,各个属性都是准备好的,也没有对外提供删除属性的方法。

问题猜想:子线程调用的时候HttpServletRequest属性丢失,肯定是哪里给删掉了,用户程序里面没有调用,那就是servlet容器给删掉了。。所以可能是用户线程已经执行完了返回给前端了,sevlet认为这个线程使用的servlet相关数据都已经无用了,所以自动对servlet对象做了销毁处理。 那子线程还没有走完,还在使用servLET,也说明子线程执行超时未完成,主线程不再等待了。。

检查猜想:将子线程执行时间设置很长,以保证子线程中的后续任务有足够时间执行。经过反复测试,没有再出现servletRequest对象丢失的问题了,猜想正确。

程序修正:不再使用HttpServeltRequest作为共享对象在各个线程之前。自定义一个线程安全的公用对象,将类似客户端相关的数据封装到该对象中,然后用于各个方法线程之间数据传递。

以上是关于多线程,共享HttpServeltRequest对象时候,对象丢失现象的主要内容,如果未能解决你的问题,请参考以下文章

9 多线程对非共享数据

多线程编程之读写锁

Java多线程之线程同步

细说Java多线程之内存可见性

多线程线程安全

Java-进阶:多线程2