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中的同一线程上),可以通过访问该全局变量来检索标识。 处理请求时删除此值也很重要,因为线程将被放回线程池中。
- Spring Autowiring Service在我的Controller中不起作用
- Virtuoso Jena API中的SPARQL查询“COUNT” – QueryParseException
- Java套接字:程序停在socket.getInputStream()没有错误?
- hadoop mapreduce:java.lang.UnsatisfiedLinkError:org.apache.hadoop.util.NativeCodeLoader.buildSupportsSnappy()Z
- java中使用generics的工厂方法模式,如何?
- RoundRectangle2D剪辑不是很流畅
- “更改java版本后,路径login.page不以”/“字符”消息exception开头
- 将一个简单的文本文件作为Java运行
- 如何根据值来比较两个地图