java - español - thread safety php
DecimalFormat.format(doble) en diferentes hilos (3)
Tengo que imprimir muchos valores decimales formateados en muchos hilos en paralelo. Para formatear los valores decimales, uso un java.text.DecimalFormat
configurado por un patrón. Soy consciente de la advertencia del documento java de DecimalFormat
:
Los formatos decimales generalmente no están sincronizados. Se recomienda crear instancias de formato separadas para cada hilo. Si varios subprocesos acceden a un formato simultáneamente, se debe sincronizar externamente.
Pero no sé si esta advertencia se aplica a mi escenario: configuro el java.text.DecimalFormat
una vez cuando se inicia la aplicación (y java.text.DecimalFormat
el Formatter
en un campo final). Después de eso SOLO uso el método de format(double)
.
La razón por la que quiero hacer esto es: no quiero perder rendimiento al crear una nueva instancia de DecimalFormat
cada vez que necesito imprimir un número con formato.
Miré el DecimalFormat.format(double)
y parece ser seguro para subprocesos, pero no estoy seguro.
¿Podría confirmar que el uso de DecimalFormat.format(double)
es seguro para subprocesos cuando no se cambia la configuración del formateador o explicar por qué no?
La implementación actual de Hotspot para DecimalFormat hace que la llamada a DecimalFormat.format (double) sea segura para subprocesos si no llama a otros métodos en esta instancia. Sin embargo, se recomienda encarecidamente no confiar en este (tal vez) comportamiento temporal.
¿Ha considerado usar una variable ThreadLocal
para evitar demasiados new DecimalFormat()
?
Si bien la implementación actual puede ser segura para subprocesos, no existe tal garantía para implementaciones futuras o para otros JRE.
¿Ha verificado que evitar el new DecimalFormat()
es un aumento de rendimiento medible en su aplicación?
Solo use este fragmento de subproceso seguro para NumberFormat
:
static ThreadLocal<NumberFormat> numberFormat = new ThreadLocal<NumberFormat>() {
@Override
public NumberFormat initialValue() {
return new DecimalFormat("00000");
}
};
O en Java 8, como dijo Jesper en un comentario:
private static ThreadLocal<NumberFormat> numberFormatter =
ThreadLocal.withInitial(() -> new DecimalFormat("00000"));