加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – ThreadLocal资源泄漏和弱引用

发布时间:2020-12-14 05:20:09 所属栏目:Java 来源:网络整理
导读:我对 ThreadLocal的有限的理解是它有 resource leak issues.我收集这个问题可以通过正确使用 WeakReferences与ThreadLocal来解决(尽管我可能误解了这一点.)我只是喜欢一个模式或示例正确使用ThreadLocal与WeakReference,如果存在.例如,在这段代码片段中将引
我对 ThreadLocal的有限的理解是它有 resource leak issues.我收集这个问题可以通过正确使用 WeakReferences与ThreadLocal来解决(尽管我可能误解了这一点.)我只是喜欢一个模式或示例正确使用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);
    }
}

解决方法

ThreadLocal内部使用了WeakReference.如果没有强烈引用ThreadLocal,那么即使各种线程都有通过该ThreadLocal存储的值,它将被垃圾回收.

此外,ThreadLocal值实际上存储在Thread中;如果线程死机,则会收集通过ThreadLocal与该线程相关联的所有值.

如果你有一个ThreadLocal作为一个最终的类成员,这是一个强大的参考,它不能被收集,直到类被卸载.但这是任何类成员的工作原理,并不被视为内存泄漏.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读