Servlet中的SimpleDateFormat

Bob*_*Bob 2 java servlets thread-local simpledateformat

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

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

    public static SimpleDateFormat get () {
        return dateFormat.get();
    }
}
Run Code Online (Sandbox Code Playgroud)

实际上,这似乎导致内存泄漏.关闭我的webapp时,Tomcat会记录以下错误消息:

严重:Web应用程序[]使用[null]类型的键创建了一个ThreadLocal(值[com.example.util.DateUtil$2@50242f7d]),类型为[java.text.SimpleDateFormat](value [java.text] .SimpleDateFormat @ d91b489b])但在Web应用程序停止时无法将其删除.这很可能造成内存泄漏.

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

Gar*_*vis 5

除了使用替代实现(commons-langjoda)之外,只需在SimpleDateFormat每次使用它时创建一个新实例.

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

请参阅我对ThreadLocal资源泄漏和WeakReference的回答

  • +1为了不使事情变得更复杂,他们就是 (3认同)
  • 昂贵是一个相对的术语,如果像http://www.thedwick.com/blog/2008/04/simpledateformat-performance-pig/中的用户一样,你似乎什么都不做,除了解析日期然后它可能是昂贵的,但如果你在运行jdbc/hibernate查询后,在html页面上放置了20个日期,它确实不会那么重要.确保您的程序正确*首先*然后快速. (3认同)