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(或任何其他非线程安全对象)的最佳方法是什么?
除了使用替代实现(commons-lang或joda)之外,只需在SimpleDateFormat每次使用它时创建一个新实例.
我意识到这会让你感到肮脏,需要洗澡,但它非常简单,不需要你做任何努力.缺点是你会比以前多翻一些内存,但在大多数普通的Web应用程序中,你不太可能注意到JDBC的噪音.
请参阅我对ThreadLocal资源泄漏和WeakReference的回答