什么时候以及如何使用ThreadLocal变量?

人走茶凉 提交于 2019-12-17 22:10:10

【推荐】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楼

  1. Java的ThreadLocal在JDK 1.2上引入,但后来在JDK 1.5中被泛化,以在ThreadLocal变量上引入类型安全性。

  2. ThreadLocal可以与Thread范围关联,由Thread执行的所有代码都可以访问ThreadLocal变量,但是两个线程彼此看不到ThreadLocal变量。

  3. 每个线程都拥有ThreadLocal变量的互斥副本,在正常情况下或由于任何异常而导致线程结束或死亡后,该线程才有资格进行垃圾回收,因为这些ThreadLocal变量没有任何其他实时引用。

  4. Java中的ThreadLocal变量通常是类中的私有静态字段,并在Thread中维护其状态。

阅读更多: Java中的ThreadLocal-示例程序和教程


#5楼

缓存时,有时您需要花费大量时间计算相同的值,因此通过将最后一组输入存储到方法和结果中,可以加快代码的速度。 通过使用线程本地存储,您无需考虑锁定。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!