tarbitrary 2014-05-13 11:06
浏览 259
已采纳

ThreadLocal引起内存泄露?

由于SimpleDateForamt是非线程安全的,所以想用ThreadLocal封装一下,但是同事说这样写会造成内存泄露,要请教一下各位,
下面这样写会造成内存泄露么,烦请大伙给指点指点,不胜感激。(环境springmvc + spring +ibatis,使用了线程池)
public class DateUtil {
    private static ThreadLocal<DateFormat> sdf = new ThreadLocal<DateFormat>() {
        protected DateFormat initialValue() {
            return new  SimpleDateFormat("yyyy-MM-dd");
        };
    };


    public static DateFormat getDateFormat(ThreadLocal<DateFormat> tl) {
        return tl.get();
    }
    public static String format(Date date) {
        if (date == null) {
            return "";
        }
        return getDateFormat(sdf).format(date);
    }



    public static Date parse(String st) throws ParseException {
        return  getDateFormat(sdf).parse(st);
    }
}
  • 写回答

8条回答 默认 最新

  • 征服.刘华强 2014-05-13 17:11
    关注

    要整明白你的问题,你需要先搞懂几个技术点,
    1: ThreadLocal的底层原理
    http://www.iteye.com/topic/103804 这有一个文章你可以参考,其实最好的办法就是自己看源码。这里一个关键性的问题就是你要清楚ThreadLocal内部并没有Map,而是线程对象内部有一个Map,而ThreadLocal是把自己当做Key,去访问线程对象当中的Map

    2: Web环境的建成池,也就是说Web服务器会有一个线程池,每次请求到达服务器端的时候就会从里面拿一个线程(假设线程A)去完成这次请求,那么当执行到你上面代码的时候就会往当前线程的MAP里放一个FORMAT对象,那么假设又有很多次请求由不同的线程完成(B,C,D) 那么他们的MAP当中同样都会放入一个FORMAT对象,然后再请求结束以后这些线程又回到线程池当中等待下次请求。然后紧接着又有请求过来了,假设这时候又是线程A去处理,那么当在执行上面的代码的时候{return tl.get()},不会在去新创建对象了,而是把线程A当中之前设置进去的对象拿出来直接用,所以不会存在内存泄露的问题。

    但是有一个问题就是会导致WEB服务器线程池内的所有线程的MAP当中都有一个format对象。因为你在线程结束的时候并没有清除掉。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

悬赏问题

  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100