当前位置: 首页 > 面试题库 >

线程本地资源泄漏和弱引用

淳于泓
2023-03-14
问题内容

我对ThreadLocal的有限理解是它存在资源泄漏问题。我认为可以通过在ThreadLocal中适当地使用WeakReferences来解决此问题(尽管我可能会误解了这一点。)我只想提供一个模式或示例,以将ThreadLocal与WeakReference一起正确使用(如果存在)。例如,在此代码段中,将引入WeakReference吗?

static class DateTimeFormatter {
    private static final ThreadLocal<SimpleDateFormat> DATE_PARSER_THREAD_LOCAL = new ThreadLocal<SimpleDateFormat>() {
        protected SimpleDateFormat initialValue() {
            return new SimpleDateFormat("yyyy/MM/dd HH:mmz");
        }
    };
    public String format(final Date date) {
        return DATE_PARSER_THREAD_LOCAL.get().format(date);
    }
    public Date parse(final String date) throws ParseException
    {
      return DATE_PARSER_THREAD_LOCAL.get().parse(date);
    }
}

问题答案:

ThreadLocalWeakReference内部使用。如果ThreadLocal未强烈引用,则即使各种线程都通过that存储值,也将对其进行垃圾回收ThreadLocal

此外,ThreadLocal值实际上存储在Thread;中。如果线程死亡,则将通过a ThreadLocal收集与该线程关联的所有值。

如果您有ThreadLocal最终班级成员的身份,那将是一个很好的参考,并且只有在卸载该类后才能收集它。但这是任何类成员的工作方式,不被视为内存泄漏。

更新: 只有在ThreadLocal强引用中存储的值ThreadLocal(某种循环引用)中,所引用的问题才起作用。

在这种情况下,值(a SimpleDateFormat)没有向后引用ThreadLocal。这段代码没有内存泄漏。



 类似资料:
  • 问题内容: 在多个帖子中都提到了这一点:不当使用会导致内存泄漏。我正在努力了解使用内存泄漏将如何发生。 我发现的唯一情况如下: Web服务器维护一个线程池(例如,用于servlet)。如果未删除其中的变量,则这些线程可能会导致内存泄漏,因为线程不会死亡。 这种情况下没有提到“ Perm Space”内存泄漏。那是内存泄漏的唯一(主要)用例吗? 问题答案: PermGen的exhaustions 与

  • Eclipse Java警告:资源泄漏:“Unassigned Closeable Value”从不关闭 漏在哪里?

  • 大家晚上好。我是一个使用Java编程的完全初学者,我正在学习“扫描仪”,但是当我在Eclipse中键入这个基本代码时,我收到一条消息说“资源泄漏:‘扫描仪’永远不会关闭。 我做错了什么?

  • 我试图理解不对任何流调用close()会如何影响系统的性能和功能。为了做到这一点,我创建了下面的测试类。

  • 我是个新手。我已经编写了这段代码,它显示那里存在资源泄漏 这是什么意思?抱歉,我太天真了。

  • Eclipse显示警告消息,表示"资源泄漏,准备好的语句未在以下位置关闭" 在我看来,finally块负责关闭preparedstatement和rs对象。你知道为什么eclipse还在抱怨资源泄漏吗?