1

在多線程環境中使用DateFormat時如何使用synchronized關鍵字?在多線程環境中使用DateFormat時使用synchronized關鍵字

我得到以下Exception

java.lang.ArrayIndexOutOfBoundsException: -1 

當我看着我的代碼,我有使用SimpleDateFormat格式化日期的方法。

public static synchronized String now(String dateFormat) { 

      if (dateFormat.equalsIgnoreCase("")) { 
       dateFormat = "yyyy-MM-dd'T'HH:mm:ss"; 
      } 
      Calendar cal = Calendar.getInstance(); 
      SimpleDateFormat sdf = null; 
      if (dateFormat == null || dateFormat.equalsIgnoreCase("")) { 
       sdf = new SimpleDateFormat(); 
      } else { 
       sdf = new SimpleDateFormat(dateFormat, Locale.getDefault()); 
      } 
      return sdf.format(cal.getTime()); 

     } 

雖然我無法重現的異常,這可能是在那裏我可能遇到的java.lang.ArrayIndexOutOfBoundsException因爲我發現了一個link它描述瞭如何在多線程環境中使用DateFormat的地方。 DateFormat不同步,因此在多線程環境中工作時可能會拋出java.lang.ArrayIndexOutOfBoundsException

但我上面的方法已經是​​方法。

我的問題是:

是靜態的方法可以是​​方法?

我需要同步SimpleDateFormat而不是​​方法的對象嗎?爲什麼?

+0

你可以看看這個http://www.javacodegeeks.com/2010/07/java-best-practices-dateformat-in.html –

+2

你的案例中的SimpleDateFormat是一個局部變量,所以它是線程安全,因爲它是「線程本地」。順便說一下,該方法根本不需要「同步」。 – assylias

+0

@assylias +1。謝謝 –

回答

3

上面顯示的方法不能訪問任何共享狀態(DateFormat創建爲本地變量),因此您不需要同步的所有

您需要找到與您的異常相關的堆棧跟蹤。否則,這只是猜測工作。

相關問題