2013-04-17 11 views
5

Forse una domanda stupida da chiedere, ma ho bisogno di alcune conferme su di esso.Dubbi sulla concorrenza con oggetti che possono essere utilizzati più volte come i formattatori

Di solito, quando mi occupo di oggetti che possono essere utilizzati più volte all'interno della mia applicazione, utilizzo un approccio simile al seguente.

Creare un'estensione, ad esempio NSDecimalNumber+Extension o un'utilità di classe in cui un formattatore di numeri viene creato come segue.

+ (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; 
} 

Questo approccio è abbastanza buono poiché, ad esempio, i formattori sono costosi da creare. Ma potrebbe essere applicato anche ad altre situazioni.

Ora, le mie domande sono le seguenti.

Questo approccio è valido anche in situazioni in cui sono coinvolti diversi percorsi di esecuzione (thread diversi)?

Quindi, se chiamo prima stringRepresentationOfDecimalNumber sul thread principale e poi in un thread diverso, cosa potrebbe accadere?

Penso sia valido per eseguire chiamate diverse a stringRepresentationOfDecimalNumber in thread diversi poiché il formattatore condiviso, in questo caso, sta solo leggendo, ma mi piacerebbe avere una risposta dagli esperti.

Grazie in anticipo.

+0

possibile duplicato di [Pensieri in accesso agli oggetti di sola lettura da diversi thread] (http://stackoverflow.com/questions/19960287/thoughts-in-accessing-read-only-objects-from-different-threads) –

risposta

2

NSNumberFormatter è mutabile, quindi in genere non è thread-safe e citato in Thread Safety Summary (vedere la sezione "Classi thread non sicure") nell'elenco delle classi non thread safe.

Ma se si tratta il tuo oggetto come un oggetto immutabile, non devi preoccuparti delle condizioni di gara. Ad esempio, non è possibile modificare il formato se ci sono più thread che accedono al formattatore. Se _internal_numberFormatter non viene modificato in alcun modo, e hai solo questi due metodi nella categoria, dovresti considerarlo thread-safe.

+0

Grazie per la tua risposta. +1. Aspetterò altre risposte per un po 'prima di contrassegnare il tuo come corretto. Grazie. –

+0

Ho creato una nuova domanda su di esso. http://stackoverflow.com/questions/19960287/thoughts-in-accessing-read-only-objects-from-different-threads. Questa è la risposta corretta. Saluti. –

+0

Quindi, per favore pensa di rimuovere la tua risposta come non corretta. Grazie. –

Problemi correlati