2011-01-10 82 views
2

我在我的Servlet中使用了很多SimpleDateFormat对象。不幸的是,SimpleDateFormat不是线程安全的。因此,我考虑使用ThreadLocal来包装它,以促进SimpleDateFormat对象的重用。我写了一个UTIL级启用此:Servlet中的SimpleDateFormat

public class DateUtil { 
    private final static ThreadLocal<SimpleDateFormat> dateFormat = new ThreadLocal<SimpleDateFormat>() { 
     return new SimpleDateFormat(); 
    } 

    public static SimpleDateFormat get() { 
     return dateFormat.get(); 
    } 
} 

其实,这似乎导致内存泄漏。当关闭我的web应用程序,Tomcat的记录以下错误信息:

重度:Web应用程序[]创建一个ThreadLocal类型的键[空](值[email protected]] )和类型为[java.text.SimpleDateFormat](值为[[email protected]])的值,但在Web应用程序停止时未能删除它。这很可能造成内存泄漏。

我知道内存泄漏的原因,但是在Servlet中处理SimpleDateFormat对象(或任何其他非线程安全的对象)的最佳方式是什么?

+0

我明白我不是一个应该被问问题的的CommNet,但什么是内存泄漏的原因是什么?在此先感谢您。 – Victor 2011-01-10 22:19:37

+0

原因是SimpleDateFormat实例将针对碰巧运行此代码的每个请求线程进行保留,在任何时候都不会删除该实例。 – 2011-01-10 22:31:25

回答

5

除了使用替代实现(commons-langjoda)每次使用它时,就是创建一个SimpleDateFormat一个新的实例。

我意识到这会让你感到肮脏​​,需要洗澡,但它很简单,不需要你的任何努力。缺点是你会比以前翻一点点内存,但在大多数正常的Web应用程序中,你不可能注意到JDBC的噪音。

见我的回答ThreadLocal Resource Leak and WeakReference

3

从commons-lang创建本地对象或使用FastDateFormat(FastDateFormat是SimpleDateFormat的快速线程安全版本)。和乔达时间是一种常见的答案所有日期相关的问题;-)