ThreadLocal资源泄漏和WeakReference

Jul*_*ang 16 java weak-references thread-local

我对ThreadLocal的有限理解是它存在资源泄漏问题.我收集这个问题可以通过在ThreadLocal中正确使用WeakReferences来解决(尽管我可能误解了这一点.)我只是想要一个模式或示例来正确使用带有WeakReference的ThreadLocal(如果存在).例如,在此代码片段中,将引入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);
    }
}
Run Code Online (Sandbox Code Playgroud)

eri*_*son 32

ThreadLocalWeakReference内部使用.如果ThreadLocal没有强引用,它将被垃圾收集,即使各种线程具有通过它存储的值ThreadLocal.

另外,ThreadLocal值实际存储在Thread; 如果线程死亡,ThreadLocal则收集与该线程通过a相关联的所有值.

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


更新:引用的问题仅在存储在ThreadLocal强引用ThreadLocal循环引用的-sort中的值时才起作用.

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


Bri*_*new 10

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

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