【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
什么时候应该使用ThreadLocal
变量?
如何使用?
#1楼
您必须非常谨慎地使用ThreadLocal模式。 有一些主要的缺点,例如Phil提到的,但没有提到的一个是确保设置ThreadLocal上下文的代码不是“可重入的”。
当设置信息的代码第二次或第三次运行时,可能会发生不好的事情,因为线程上的信息可能在您不期望的时候开始发生变异。 因此,在再次设置之前,请确保未设置ThreadLocal信息。
#2楼
这里没有什么新鲜的东西,但是我今天发现,在Web应用程序中使用Bean验证时, ThreadLocal
非常有用。 验证消息已本地化,但默认情况下使用Locale.getDefault()
。 您可以使用其他MessageInterpolator
配置Validator
,但是在调用validate
时无法指定Locale
。 因此,您可以创建一个静态ThreadLocal<Locale>
(或者更好的是,一个具有其他内容的常规容器,您可能需要成为ThreadLocal
,然后让您的自定义MessageInterpolator
从中选择Locale
。下一步是编写一个使用会话的ServletFilter
value或request.getLocale()
来选择语言环境并将其存储在ThreadLocal
引用中。
#3楼
Webapp服务器可能会保留一个线程池,应在响应客户端之前删除ThreadLocal
,这样,下一个请求可以重用当前线程。
#4楼
Java的ThreadLocal在JDK 1.2上引入,但后来在JDK 1.5中被泛化,以在ThreadLocal变量上引入类型安全性。
ThreadLocal可以与Thread范围关联,由Thread执行的所有代码都可以访问ThreadLocal变量,但是两个线程彼此看不到ThreadLocal变量。
每个线程都拥有ThreadLocal变量的互斥副本,在正常情况下或由于任何异常而导致线程结束或死亡后,该线程才有资格进行垃圾回收,因为这些ThreadLocal变量没有任何其他实时引用。
Java中的ThreadLocal变量通常是类中的私有静态字段,并在Thread中维护其状态。
阅读更多: Java中的ThreadLocal-示例程序和教程
#5楼
缓存时,有时您需要花费大量时间计算相同的值,因此通过将最后一组输入存储到方法和结果中,可以加快代码的速度。 通过使用线程本地存储,您无需考虑锁定。
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3144180