开发者社区> 问答> 正文

非阻塞的servlet还能在线程内共享对象吗?

我看到 tomcat 6 开始有了非阻塞的功能,我知道以前是“单例多线程”的,如果在一次servlet中,我要在整个执行流程的后面某个方法里使用一个未经传递的参数(例如request没有传递而流经多层方法后某个方法要判断 session 里的某个属性),可以通过在一个静态类中用 Map 来共享。

但是,如果改成非阻塞的模式了,是不是说无法用线程 ID 来区别请求了?例如开始我在当前线程 ID 123 下存入对象 A,执行到后面的方法里取出的时候可能线程 ID 已经是 345 了(这个我觉得不可能);如果不是前面这样,那会不会我当前线程 ID 123 还没结束,另一个处理新请求的线程 ID 有可能也是 123。

能不能详细的解释下这个非阻塞的实现方式。尤其是在 doService 方法开始,跟以前有什么不同了吗?

展开
收起
小旋风柴进 2016-02-29 16:50:32 2440 0
1 条回答
写回答
取消 提交回答
  • 不会存在 doService 过程中调用的对象/方法处于另一个线程中(当然你自己在后面用了多线程除外),也不可能同一工作线程同时处理不同请求,只是主线程变化了而已。

    BIO是:收到请求,从线程池取一个空闲线程处理请求,直到处理完成返回结果。

    NIO是:收到请求,主线程将其通过管道(或类似方式)交给一个空闲的工作线程(或创建一个新线程),此时主线程又可以去处理其他请求了,工作线程在处理完后触发事件通知主线程完成,主线程再将状态/结果返回给客户端。

    所以,在 doService 中在一个静态类的属性中存入 currentThreadID=>Data ,在后面的调用中通过 currentThreadID 取出前面共享的数据是仍然可行的。

    不知道我的理解对不对?如不对请帮忙解疑。

    2019-07-17 18:50:34
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
多IO线程优化版 立即下载
对象的生命期管理 立即下载
低代码开发师(初级)实战教程 立即下载