servlet中的threadlocal变量

时间:2008-11-26 18:55:00

标签: java multithreading servlets concurrency thread-local

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

我在服务器上使用树脂。

感谢awnser。

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

具体案例:

我想:

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

5 个答案:

答案 0 :(得分:4)

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

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

或者你可以使用Spring ......

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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