2012-12-06 64 views
3

我正在處理這個項目。有具有類DefaultsHelper:靜態方法,靜態變量可以通過web應用程序中的多個線程進行變異 - jsp

public class DefaultsHelper { 

    static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd") ; 

    public static String getDate(int days) 
    { 
     GregorianCalendar c = new GregorianCalendar() ; 
     c.setTime(new Date()) ; 
     c.add(Calendar.DAY_OF_MONTH, days); 
     return df.format(c.getTime()) ; 

    } 
} 

在Web應用程序 - 如果在觀看的一個jsp,由此GETDATE函數被調用在完全相同的時間兩個用戶 - 這可能是東風對象可以得到不一致的,從而不返回預期值?

我覺得DefaultsHelper本來是一個實用工具類停止不必實例新的DF對象

回答

5

創建每個線程一個新Calendar,這是很好的,但您使用的SimpleDateFormat在多個線程。如果這個類是線程安全的,這將是好的,但它不是

SimpleDateFormatnotorious for being thread-unsafe。只需爲每個調用(即在方法中)創建一個新的調用,或者更好的是,使用Joda-Time來完全避免線程問題。

關於創建一個格式化類作爲優化的主題,這是過早優化和無意結果的經典示例。鑑於這是在JSP內部,HTTP請求/響應時間將使新格式化程序的安裝時間(和資源需求)變得更加渺小。讓您的類變得線程安全並且不可變,並且在成爲問題時擔心優化。

+0

謝謝我認爲可能是這樣的 - 我會更好的實例化一個新的SimpleDateFormat內部的方法然後或改變整個事情的工作方式!在dbase寫這種方式的時候保存了一個糟糕的文件 – user1882639

+0

您將通過在您的應用程序中搜索SimpleDateFormat的靜態實例來大幅增強您的線程安全性! –

+0

非常感謝,我改變了靜態像這樣 - 看起來好嗎? public static String getDate(int days) { GregorianCalendar c = new GregorianCalendar(); c.setTime(new Date()); SimpleDateFormat dft = new SimpleDateFormat(「yyyy-MM-dd」); c.add(Calendar.DAY_OF_MONTH,days); return dft.format(c.getTime()); } – user1882639