2010-07-15 175 views
7

我知道SimpleDateFormat和NumberFormat不是線程安全的。
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4101500Java MessageFormat類線程安全嗎? (而不是SimpleDateFormat)

但是其他格式類如MessageFormat呢?

Fortify 360將「MessageFormat.format(String,Object ...)」靜態方法用作「Race Condition - Format Flaw」問題的標記,但是當我分析MessageFormat的源代碼時,我看到在那個方法中,它創建了一個新的MessageFormat本地實例。

Java MessageFormat類線程安全嗎?

回答

9

javadocMessageFormat說:

消息格式是不同步的。 建議爲每個線程創建單獨的 格式實例。如果多個線程同時訪問格式 ,則必須在外部同步 。

所以官方沒有 - 它不是線程安全的。

SimpleDateFormat的文檔有很多相同的內容。

現在,文檔可能只是保守,實際上它可以在多個線程中正常工作,但它不值得冒險。

+0

感謝您展示JavaDoc,這對我來說已經足夠了。當我查看MessageFormat的源代碼時,我更清楚爲什麼它不是線程安全的。該類使用NumberFormat和DateFormat兩個不是線程安全的類。 – thenonhacker 2010-07-17 05:55:49

6

如果您referrring的方法

public static String format(String pattern, Object... arguments) 

這是線程安全的,因爲在javadoc中所描述的創建一個新的MessageFormat做格式化。

BTW,這就是你的標題 'SimpleThreadFormat' :)

0

每javadoc的一個有趣的錯字,MessageFormat對象不是線程安全的。您可以使用ThreadLocal爲每個需要一個線程的線程創建一個單獨的對象。

ThreadLocal<MessageFormat> threadLocalMessageFormat = 
    new ThreadLocal<MessageFormat>() { 
     @Override 
     protected MessageFormat initialValue() { 
      return new MessageFormat(pattern); 
     } 
    }; 

然後可以使用threadLocalMessageFormat.get()獲得MessageFormat當前線程。