关于一次请求过程中某个变量能否多线程间共享的问题?

关键我是洛哥 2013-11-19 10:56:20
浏览器的一次web请求 后台拦截后将request变量放到ThreadLocal中 这时候 如果后续执行方法没有启动子线程的话 可以在后续方法中获取到request变量 但是如果启动了子线程 在后续方法中将不能取得request变量

请问各位大神 有没有方法 在子线程中也能取得request中的信息
...全文
437 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
关键我是洛哥 2013-11-26
  • 打赏
  • 举报
回复
引用 8 楼 spiniper 的回复:
楼主可以直接把request作为参数传入到另一个线程中并使用,不过前提是你必须保证子线程在请求线程结束前结束,可惜很多时候这无法保证,所以并不建议使用子线程去做request对象要做的事情,你更应该讲request中的信息抽取出来,然后再传入到子线程中完成,而不是直接使用request对象。 当然,你也可以在子线程完成钱阻塞请求线程,但是这样,你认为子线程还有意义么?
有道理
树成 2013-11-21
  • 打赏
  • 举报
回复
楼主可以直接把request作为参数传入到另一个线程中并使用,不过前提是你必须保证子线程在请求线程结束前结束,可惜很多时候这无法保证,所以并不建议使用子线程去做request对象要做的事情,你更应该讲request中的信息抽取出来,然后再传入到子线程中完成,而不是直接使用request对象。 当然,你也可以在子线程完成钱阻塞请求线程,但是这样,你认为子线程还有意义么?
seqwait 2013-11-20
  • 打赏
  • 举报
回复
ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。 通过ThreadLocal.set()将这个新创建的对象的引用保存到各线程的自己的一个map中,每个线程都有这样一个map,执行ThreadLocal.get()时,各线程从自己的map中取出放进去的对象,因此取出来的是各自自己线程中的对象,ThreadLocal实例是作为map的key来使用的。 如果ThreadLocal.set()进去的东西本来就是多个线程共享的同一个对象,那么多个线程的ThreadLocal.get()取得的还是这个共享对象本身,还是有并发访问问题。
关键我是洛哥 2013-11-20
  • 打赏
  • 举报
回复
引用 2 楼 defonds 的回复:
先了解下 servlet 的生命周期吧
这个跟selvlet周期有什么关系啊 我取值在后台啊 肯定周期还没有结束的啊
关键我是洛哥 2013-11-20
  • 打赏
  • 举报
回复
引用 3 楼 yao752915708 的回复:
[quote=引用 1 楼 huxiweng 的回复:] 你干嘛要把request放进去呢?你就不能把request里面的数据取出来再用。 request完了,servlet会执行destory方法,执行了就没了
我只是举个例子 实际放的是Map 如果方法中跑了线程 再后续的方法中就取不到值了[/quote] 这个跟selvlet周期有什么关系啊 我取值在后台啊 肯定周期还没有结束的啊
关键我是洛哥 2013-11-20
  • 打赏
  • 举报
回复
引用 1 楼 huxiweng 的回复:
你干嘛要把request放进去呢?你就不能把request里面的数据取出来再用。 request完了,servlet会执行destory方法,执行了就没了
我只是举个例子 实际放的是Map 如果方法中跑了线程 再后续的方法中就取不到值了
老周(重庆) 2013-11-20
  • 打赏
  • 举报
回复
可以使用ConcurrentMap接口,解决多线程同步问题,而且比hashTable效率很多
Defonds 2013-11-20
  • 打赏
  • 举报
回复
先了解下 servlet 的生命周期吧
teemai 2013-11-19
  • 打赏
  • 举报
回复
你干嘛要把request放进去呢?你就不能把request里面的数据取出来再用。 request完了,servlet会执行destory方法,执行了就没了

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧