对于拥有变量的servlet的所有请求,threadlocals变量是否全局?
我在服务器上使用树脂。
感谢awnser。
我想我可以让自己更清楚。
具体案例:
我想:
答案 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中的同一线程上),可以通过访问该全局变量来检索标识。处理请求时删除此值也很重要,因为该线程将被放回线程池中。