加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

在Java中,当修改ThreadLocal对象时,更改是否会在下一个请求中保

发布时间:2020-12-15 08:43:22 所属栏目:Java 来源:网络整理
导读:在典型的Web应用程序中,当请求进入时,过滤器在http会话中查找Context对象.如果不存在,则创建Context对象并将其存储在http会话中.此外,此Context对象也存储在ThreadLocal对象中.路径下的Servlet从ThreadLocal中检索此Context对象并对其进行修改.返回响应时,过
在典型的Web应用程序中,当请求进入时,过滤器在http会话中查找Context对象.如果不存在,则创建Context对象并将其存储在http会话中.此外,此Context对象也存储在ThreadLocal对象中.路径下的Servlet从ThreadLocal中检索此Context对象并对其进行修改.返回响应时,过滤器现在使ThreadLocal中的Context对象为空.因此,当用户发出另一个请求时,他是否能够看到修改后的Context对象?

谢谢
奎德

解决方法

是的,用户将看到Context对象,因为对它的引用存储在HttpSession中.尽管ThreadLocal中的引用是空的,但在第二个请求期间仍会在会话中找到它.

编辑:在OpenJDK sourcecode of ThreadLocal(从第410行)你可以看到ThreadLocal的set和remove方法之间的区别.调用set(null)将使ThreadLocalMap条目保留为空值,而remove()将完全删除它.它对您的问题没有任何影响,在Session中仍然会引用您的Context对象.

当我第一次阅读你的问题标题时,我解释它的方式不同,因为没有提到HttpSession或清除ThreadLocal.也许这让一些响应者感到困惑.听起来你想知道在第一个请求中是否仍然可以访问第一个请求(并且未清除)中设置的ThreadLocal变量.我认为答案是,这取决于您的网络服务器如何处理线程.如果有一个10个线程的线程池被随机重用,那么你应该有10%的机会在第二个请求中找到相同的ThreadLocal变量.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读