簡體   English   中英

Servlet中的SimpleDateFormat

[英]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-langjoda )之外,每次使用它時都只需創建一個SimpleDateFormat的新實例。

我意識到這會讓你感到骯臟​​,需要洗澡,但它非常簡單,不需要你做任何努力。 缺點是你會比以前多翻一些內存,但在大多數普通的Web應用程序中,你不太可能注意到JDBC的噪音。

請參閱我對ThreadLocal資源泄漏和WeakReference的回答

從commons-lang創建本地對象或使用FastDateFormat (FastDateFormat是SimpleDateFormat的快速且線程安全的版本。)。 joda-time是所有日期相關問題的常見答案;-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM