servlet中的threadlocal变量

threadlocals变量是否对拥有变量的servlet的所有请求都是全局的?

我在服务器上使用树脂。

谢谢awnser。

我想我可以让自己更清楚。

具体案例:

我要:

  • 请求开始执行时初始化静态变量。
  • 能够以线程安全的方式在从servlet调用的方法的进一步执行中查询变量的值,直到请求结束执行

简短回答:是的。
更长一点:这就是Spring的神奇之处。 请参阅RequestContextHolder(通过DocJar)。

但是需要注意 – 您必须知道何时使ThreadLocal无效,如何推迟到其他线程以及如何(不)与非线程本地上下文纠缠在一起。

或者你可以使用Spring ……

我认为它们对于仅使用该特定线程发出的所有请求都是全局的。 其他线程获取线程本地数据的其他副本。 这是线程本地存储的关键点: http : //en.wikipedia.org/wiki/Thread-local_storage#Java 。

除非您检查servlet配置中的相应选项,否则servlet容器将使用具有多个线程的servlet来并行处理请求。 因此,您可以为每个为客户提供服务的线程提供单独的数据。

如果您的WebApplication未分发(在多个Java虚拟机上运行),您可以使用ServletContext对象跨请求和线程存储共享数据(请务必进行正确的锁定)。

就像Adiel所说的那样,正确的方法是使用请求上下文(即HttpServletRequest),而不是创建ThreadLocal。 虽然在这里使用ThreadLocal当然是可能的,但是如果你这样做,你必须小心清理你的线程,否则获取线程的下一个请求将看到与前一个请求相关联的值。 (当第一个请求与线程完成时,线程将返回到池中,因此下一个请求将看到它。)没有理由在请求上下文存在时为了这个目的而必须管理那种事情。

如果使用Servlet 3.0 Suspendable请求(或Jetty Continuations),使用ThreadLocal存储请求范围信息可能会中断使用这些API的多个线程处理单个请求。

Threadlocal变量始终定义为全局访问,因为要点是透明地在可以在任何地方访问的系统中传递信息。 变量的值绑定到设置它的线程,因此即使变量是全局变量,它也可以具有不同的值,具体取决于访问它的线程。

一个简单的例子是当在servlet中接收到请求时,将用户标识字符串分配给线程局部变量中的线程。 在该请求的处理链中的任何位置(假设它位于同一VM中的同一线程上),可以通过访问该全局变量来检索标识。 处理请求时删除此值也很重要,因为线程将被放回线程池中。