什么时候应该使用变量?ThreadLocal
如何使用?
网友回答:
由于 a 是对给定数据中的引用,因此在使用线程池的应用程序服务器中使用 s 时,最终可能会出现类加载泄漏。在清理任何 u 或使用 的方法时,您需要非常小心。ThreadLocal
Thread
ThreadLocal
ThreadLocal
get()
set()
ThreadLocal
remove()
如果在完成后不清理,则它对作为已部署 Web 应用的一部分加载的类的任何引用都将保留在永久堆中,并且永远不会被垃圾回收。重新部署/取消部署 Web 应用不会清理每个 对 Web 应用类的引用,因为 不是 Web 应用拥有的内容。每个后续部署都将创建该类的新实例,该实例永远不会被垃圾回收。Thread
Thread
由于一些谷歌搜索之后,您最终会出现内存不足异常,可能会增加而不是修复错误。java.lang.OutOfMemoryError: PermGen space
-XX:MaxPermSize
如果最终遇到这些问题,则可以通过使用 Eclipse 的内存分析器和/或遵循 Frank Kieviet 的指南和后续操作来确定哪个线程和类保留了这些引用。
更新:重新发现了Alex Vasseur的博客条目,该条目帮助我追踪了我遇到的一些问题。ThreadLocal
网友回答:
一种可能(也是常见的)用途是,当您有一些不是线程安全的对象,但您希望避免同步对该对象的访问时(我在看你,SimpleDateFormat)。相反,为每个线程提供其自己的对象实例。
例如:
public class Foo
{
// SimpleDateFormat is not thread-safe, so give one to each thread
private static final ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>(){
@Override
protected SimpleDateFormat initialValue()
{
return new SimpleDateFormat("yyyyMMdd HHmm");
}
};
public String formatIt(Date date)
{
return formatter.get().format(date);
}
}
文档。
网友回答:
许多框架使用 ThreadLocals 来维护与当前线程相关的一些上下文。例如,当当前事务存储在 ThreadLocal 中时,您无需通过每个方法调用将其作为参数传递,以防堆栈中的某个人需要访问它。Web 应用程序可能会在 ThreadLocal 中存储有关当前请求和会话的信息,以便应用程序可以轻松访问它们。使用 Guice,您可以在为注入的对象实现自定义作用域时使用 ThreadLocals(Guice 的默认 servlet 作用域很可能也使用它们)。
ThreadLocals 是一种全局变量(尽管由于它们仅限于一个线程,因此稍微不那么邪恶),因此在使用它们时应小心以避免不必要的副作用和内存泄漏。设计您的 API,以便在不再需要 ThreadLocal 值时始终自动清除它们,并且不可能错误地使用 API(例如,像这样)。ThreadLocals可以用来使代码更简洁,在极少数情况下,它们是使某些东西工作的唯一方法(我目前的项目有两个这样的情况;它们记录在“静态字段和全局变量”下)。
模板简介:该模板名称为【我应该何时以及如何使用 ThreadLocal 变量?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Java】栏目查找您需要的精美模板。