2010-07-15 345 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当前线程。

相关问题