2010-07-15 15 views
7

Sé que SimpleDateFormat y NumberFormat NO son seguros para subprocesos.
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4101500¿Es seguro el subproceso de la clase Java MessageFormat? (a diferencia de SimpleDateFormat)

¿Pero qué pasa con las otras clases de formato como MessageFormat?

Fortify 360 está marcando el uso del método estático "MessageFormat.format (String, Object ...)" como un problema de "Condición de carrera - Formato defectuoso", pero cuando analizo el código fuente de MessageFormat, vi que en ese método, crea una nueva instancia local de MessageFormat.

¿Es seguro el subproceso Java MessageFormat Class?

Respuesta

9

El javadoc para MessageFormat dice: formatos

de mensajes no están sincronizados. Se recomienda crear instancias de formato separadas para cada subproceso. Si varios subprocesos acceden a un formato al mismo tiempo, se debe sincronizar externamente.

Así que oficialmente, no - no es seguro para subprocesos.

Los documentos para SimpleDateFormat dicen más o menos lo mismo.

Ahora, los documentos pueden solo ser conservadores, y en la práctica funcionará bien en varios hilos, pero no vale la pena el riesgo.

+0

Gracias por mostrar el JavaDoc, eso sería suficiente para mí. Cuando vi el código fuente de MessageFormat, me queda aún más claro por qué no es seguro para subprocesos. Esa clase utiliza NumberFormat y DateFormat, dos clases que no son seguras para subprocesos. – thenonhacker

6

Si se referrring al método

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

esto es seguro para subprocesos ya que como se describe en el Javadoc se crea un nuevo MessageFormat hacer el formato.

Por cierto, eso es un error tipográfico divertido en su título 'SimpleThreadFormat' :)

0

por el Javadoc, MessageFormat objetos no son seguros para subprocesos. Puede usar un ThreadLocal para crear un objeto separado para cada hilo que lo necesite.

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

entonces usted puede utilizar para obtener una threadLocalMessageFormat.get()MessageFormat para el subproceso actual.

Cuestiones relacionadas