Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,当修改ThreadLocal对象时,更改是否会保留在下一个请求中?_Java_Thread Local - Fatal编程技术网

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

在Java中,当修改ThreadLocal对象时,更改是否会保留在下一个请求中?,java,thread-local,Java,Thread Local,在典型的web应用程序中,当请求传入时,过滤器会在http会话中查找上下文对象。如果不存在上下文对象,它将创建上下文对象并将其存储在http会话中。此外,此上下文对象也存储在ThreadLocal对象中。路径上的Servlet从ThreadLocal检索此上下文对象并对其进行修改。当返回响应时,过滤器现在会使ThreadLocal中的上下文对象为空。因此,当用户发出另一个请求时,他能看到修改过的上下文对象吗 谢谢 Quadir否。如果将其设为空(或者最好调用threadLocal.remove(

在典型的web应用程序中,当请求传入时,过滤器会在http会话中查找上下文对象。如果不存在上下文对象,它将创建上下文对象并将其存储在http会话中。此外,此上下文对象也存储在ThreadLocal对象中。路径上的Servlet从ThreadLocal检索此上下文对象并对其进行修改。当返回响应时,过滤器现在会使ThreadLocal中的上下文对象为空。因此,当用户发出另一个请求时,他能看到修改过的上下文对象吗

谢谢 Quadir

否。如果将其设为空(或者最好调用
threadLocal.remove()
),该值将丢失


如果您不这样做,那么下一个被分配相同线程的请求可能会看到它(servlet容器使用线程池)。但这是线程池的一个不良副作用——您应该始终清理线程池。()

这取决于上下文。会话和应用程序上下文被显式还原,而请求上下文和其他线程局部变量绝对不能在请求之间持久化,因为同一个线程可以(并且通常会)处理来自完全不同用户的请求。我相信一些(如果不是全部的话)web容器会故意删除所有ThreadLocals,以避免用户意外共享数据。

否-除非您使用线程池,否则下一个请求不会看到它。但是,与其将其设为null,不如在线程本地实例上调用remove(),否则可能会导致内存泄漏。

是的,用户将看到上下文对象,因为对它的引用存储在HttpSession中。即使ThreadLocal中的引用为空,在第二次请求期间仍会在会话中找到它

编辑:在(第410行)中,您可以看到ThreadLocal的set和remove方法之间的差异。调用set(null)将使用null值保留ThreadLocalMap条目,而remove()将完全删除它。这对您的问题没有影响,会话中仍然会有对上下文对象的引用


当我第一次阅读您的问题标题时,我的解释不同,因为没有提到HttpSession或清除ThreadLocal。也许这让一些回应者感到困惑。听起来您想知道在第一个请求中设置的ThreadLocal变量(未清除)在第二个请求中是否仍然可以访问。我认为答案是,这取决于您的Web服务器如何处理线程。如果存在随机重用的10个线程组成的线程池,则在第二个请求中找到相同ThreadLocal变量的几率应为10%

听起来这是一个很容易回答的问题,只要试一下就可以了,不是吗?阿德里安,谢谢。我编写了一个测试程序,能够在后续请求中看到修改过的上下文对象。早些时候有人指出,我需要使用ThreadLocal.remove()而不是ThreadLocal.set(null)。有什么区别?