Dudas sobre la concurrencia con objetos que se pueden usar varias veces como formateadores

Tal vez una pregunta estúpida para hacer, pero necesito algunas confirmaciones al respecto.

Generalmente, cuando trato con objetos que pueden usarse varias veces dentro de mi aplicación, utilizo un enfoque como el siguiente.

Crear una extensión, por ejemplo,NSDecimalNumber+Extension, o una utilidad de clase donde se crea un formateador de números como el siguiente.

+ (NSNumberFormatter*)internal_sharedNumberFormatter
{
    static NSNumberFormatter* _internal_numberFormatter = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _internal_numberFormatter = [[NSNumberFormatter alloc] init];
        // other configurations here...
    });

    return _internal_numberFormatter;
}

+ (NSString*)stringRepresentationOfDecimalNumber:(NSDecimalNumber*)numberToFormat
{
    NSString *stringRepresentation = [[self class] internal_sharedNumberFormatter] stringFromNumber:numberToFormat];
    return stringRepresentation;
}

Este enfoque es bastante bueno ya que, por ejemplo, los formateadores son costosos de crear. Pero también podría aplicarse a otras situaciones.

Ahora, mis preguntas son las siguientes.

¿Este enfoque también es válido en situaciones donde se involucran diferentes rutas de ejecución (diferentes hilos)?

Así que, si llamo primerostringRepresentationOfDecimalNumber en el hilo principal y luego en un hilo diferente, ¿qué podría pasar?

Creo que es válido realizar diferentes llamadas astringRepresentationOfDecimalNumber en diferentes subprocesos, ya que el formateador compartido, en este caso, es de solo lectura, pero me gustaría recibir una respuesta de expertos.

Gracias por adelantado.