Es el Java MessageFormat de la Clase thread safe?(como opuesto a SimpleDateFormat)
-
16-09-2020 - |
Pregunta
Sé que SimpleDateFormat y NumberFormat NO son seguros para subprocesos.
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4101500
Pero, ¿qué acerca de las otras clases de Formato como MessageFormat?
Fortalecer 360 está decayendo en el uso de "MessageFormat.format(String, Object...)" método estático como una "Carrera de Condición - Formato de Error" problema, pero cuando voy a analizar el código fuente de MessageFormat, vi que en este método, se crea una nueva instancia local de MessageFormat sí mismo.
Es el Java MessageFormat de la Clase thread safe?
Solución
The javadoc para MessageFormat
dice:
Los formatos de mensaje no están sincronizados. Se recomienda crear separado. Formato de instancias para cada hilo.Si Múltiples subprocesos acceden a un formato Al mismo tiempo, debe ser sincronizado. externamente.
Oficialmente, no, no es seguro.
Los documentos para SimpleDateFormat
dicen mucho lo mismo.
Ahora, los documentos pueden ser conservadores, y en la práctica, funcionará bien en múltiples hilos, pero no vale la pena el riesgo.
Otros consejos
Si se está refrescando al método
public static String format(String pattern, Object... arguments)
Esto es seguro de hilo, ya que como se describe en el Javadoc, crea un nuevo MessageFormat para hacer el formato.
Por cierto, eso es un typo divertido en su título 'SIMPLETHREADFORMAT' :)
Por el javadoc, MessageFormat
los objetos no son seguros para subprocesos.Usted puede utilizar un ThreadLocal
para crear un objeto independiente para cada subproceso que necesita uno.
ThreadLocal<MessageFormat> threadLocalMessageFormat =
new ThreadLocal<MessageFormat>() {
@Override
protected MessageFormat initialValue() {
return new MessageFormat(pattern);
}
};
Usted puede utilizar threadLocalMessageFormat.get()
para obtener un MessageFormat
para el subproceso actual.