[英]SimpleDateFormat in Servlets
我在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();
}
}
實際上,這似乎導致內存泄漏。 關閉我的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的噪音。
從commons-lang創建本地對象或使用FastDateFormat (FastDateFormat是SimpleDateFormat的快速且線程安全的版本。)。 joda-time是所有日期相關問題的常見答案;-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.