日期:2014-05-17  浏览次数:20571 次

关于一次请求过程中某个变量能否多线程间共享的问题?
浏览器的一次web请求 后台拦截后将request变量放到ThreadLocal中 这时候 如果后续执行方法没有启动子线程的话 可以在后续方法中获取到request变量 但是如果启动了子线程 在后续方法中将不能取得request变量

请问各位大神 有没有方法 在子线程中也能取得request中的信息

------解决方案--------------------
你干嘛要把request放进去呢?你就不能把request里面的数据取出来再用。
request完了,servlet会执行destory方法,执行了就没了
------解决方案--------------------
先了解下 servlet 的生命周期吧
------解决方案--------------------
ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。 

通过ThreadLocal.set()将这个新创建的对象的引用保存到各线程的自己的一个map中,每个线程都有这样一个map,执行ThreadLocal.get()时,各线程从自己的map中取出放进去的对象,因此取出来的是各自自己线程中的对象,ThreadLocal实例是作为map的key来使用的。
如果ThreadLocal.set()进去的东西本来就是多个线程共享的同一个对象,那么多个线程的ThreadLocal.get()取得的还是这个共享对象本身,还是有并发访问问题。 
------解决方案--------------------
楼主可以直接把request作为参数传入到另一个线程中并使用,不过前提是你必须保证子线程在请求线程结束前结束,可惜很多时候这无法保证,所以并不建议使用子线程去做request对象要做的事情,你更应该讲request中的信息抽取出来,然后再传入到子线程中完成,而不是直接使用request对象。
当然,你也可以在子线程完成钱阻塞请求线程,但是这样,你认为子线程还有意义么?