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

2022-09-02 11:27:11

我对ThreadLocal的有限理解是它有资源泄漏问题。我认为这个问题可以通过在ThreadLocal中正确使用弱引用来补救(尽管我可能误解了这一点)。我只是想得到一个模式或示例,用于正确使用带有弱引用的ThreadLocal,如果存在的话。例如,在此代码片段中,将在哪里引入弱引用?

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);
    }
}

答案 1

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

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

如果您有一个作为最终类成员,这是一个强引用,并且在卸载类之前无法收集它。但这是任何类成员的工作方式,不被视为内存泄漏。ThreadLocal


更新:只有当存储在强引用中的值(某种循环引用)时,引用的问题才会发挥作用。ThreadLocalThreadLocal

在本例中,值 (a) 没有对 的反向引用。此代码中没有内存泄漏。SimpleDateFormatThreadLocal


答案 2

我猜你正在跳过这些箍,因为SimpleDateFormat不是线程安全的

虽然我知道我没有解决你上面的问题,但我能建议你看看Joda的日期/时间工作吗?Joda 具有线程安全的日期/时间格式化机制。您也不会浪费时间学习Joda API,因为它是新标准日期/时间API提案的基础。


推荐