当我强烈引用保存资源的ThreadLocal时,如下面的示例所示;
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表示;
其线程本地实例的所有副本都要接受垃圾收集(除非存在对这些副本的其他引用)。
如果是这样的话,那么如何确保一个副本不断可用呢?
发布于 2011-06-24 10:19:07
您的代码的问题是您将保持一个文件指针打开。您可以在ThreadLocal中存储对象,但不存储需要关闭的资源,如文件句柄、db连接或其他资源。ThreadLocal将超出范围,因此一旦线程完成,就会被垃圾收集。在您的例子中,我会将您从InputStream获得的内容存储在ThreadLocal中,而不是流本身。
如果您想确保某些东西总是可用的,请使用Singleton模式。注意该模式在Java环境中的局限性。
发布于 2011-06-24 10:15:02
线程本地中的输入流不是通过弱引用存储的(它由一个普通的强引用存储),因此只要线程本地对象本身可用,它中的输入流也是可用的,直到调用移除()为止。
但是,线程本地本身作为弱引用存储在每个线程的ThreadLocalMap中。其思想是每个线程都有一个用于ThreadLocalMap的字段,其中所有线程局部变量都使用带有相应值的弱引用键。
https://stackoverflow.com/questions/6466283
复制相似问题