首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ThreadLocal资源

ThreadLocal资源
EN

Stack Overflow用户
提问于 2011-06-24 10:03:02
回答 2查看 1K关注 0票数 3

当我强烈引用保存资源的ThreadLocal时,如下面的示例所示;

代码语言:javascript
复制
private final static ThreadLocal<InputStream> resource = new ThreadLocal<InputStream>()
{
@Override
protected InputStream initialValue()
{
  ClassLoader loader = Thread.currentThread().getContextClassLoader();
  InputStream input = loader.getResourceAsStream("doc/doc.xml");
  if (input == null) throw new RuntimeException("Could not locate doc.xml");
  return input;
 }
};

在什么时间点/范围内,持有在InputStream中的ThreadLocal是不可维护的。我想知道在某个不使用ThreadLocal对象的时候,JVM是否会垃圾收集它的引用,从而无法访问嵌套的InputStream

javadoc表示;

其线程本地实例的所有副本都要接受垃圾收集(除非存在对这些副本的其他引用)。

如果是这样的话,那么如何确保一个副本不断可用呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-24 10:19:07

您的代码的问题是您将保持一个文件指针打开。您可以在ThreadLocal中存储对象,但不存储需要关闭的资源,如文件句柄、db连接或其他资源。ThreadLocal将超出范围,因此一旦线程完成,就会被垃圾收集。在您的例子中,我会将您从InputStream获得的内容存储在ThreadLocal中,而不是流本身。

如果您想确保某些东西总是可用的,请使用Singleton模式。注意该模式在Java环境中的局限性。

票数 2
EN

Stack Overflow用户

发布于 2011-06-24 10:15:02

线程本地中的输入流不是通过弱引用存储的(它由一个普通的强引用存储),因此只要线程本地对象本身可用,它中的输入流也是可用的,直到调用移除()为止。

但是,线程本地本身作为弱引用存储在每个线程的ThreadLocalMap中。其思想是每个线程都有一个用于ThreadLocalMap的字段,其中所有线程局部变量都使用带有相应值的弱引用键。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6466283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档