2012-05-08 11 views

risposta

9

Come avete formulato la domanda, entrambe le affermazioni sono equivalenti come una questione di strategia di sicurezza concorrente.

A seconda della scala e del completamento del lavoro sul progetto, è possibile prendere in considerazione una strategia alternativa per la sicurezza del thread.

Recentemente, Apple ha fatto un punto di raccomandare la sicurezza del thread-by-serialization piuttosto che il blocco tradizionale. In breve, con l'aumentare della contesa, l'accesso serializzato è molto più efficiente del blocco con @synchronize.

Anziché sincronizzare, prendere in considerazione l'impostazione di una coda seriale GCD e l'accodamento dell'accesso alle risorse condivise tra thread.

+0

O meglio, usa pattern lettore-scrittore, una coda concorrente GCD, esegue letture con 'dispatch_sync' e scrive con' dispatch_barrier_async'. – Rob

10

L'utilizzo di @syncrhonized(obj) costituisce un blocco in modo che l'altro codice di sincronizzazione su obj non venga eseguito contemporaneamente.

Le proprietà atomiche funzionano impedendo che vengano apportate modifiche mentre si accede a una proprietà; forniscono il blocco implicito per l'accesso.

array = someObject.array; //locked 
[array doSomething];  //no longer locked 

Non è possibile sostituire getter e setter per atomic proprietà, ma utilizzando la direttiva @sycnronized tutto il getter/setter dovrebbe essere sufficiente.

@synthesize array=_array; 

... 

-(void)setArray 
{ 
    @synchronized(self) 
    { 
     _array = array; 
    } 
} 

-(NSArray *)array 
{ 
    NSArray *retVal; 

    @synchronized(self) 
    { 
     retVal = _array; 
    } 

    return retVal; 
} 

Onestamente, a meno che non si sta facendo un po 'di programmazione multithread seriamente, proprietà atomiche sono inutili e solo causano colpi di prestazioni.

+1

Chiaramente, gli esempi getter e setter che utilizzano '@ synchronized' sono ben lontani dalla sicurezza del thread e quindi non si potrebbe quasi mai applicare questo modello. Uno spesso deve eseguire la sincronizzazione ad un livello superiore per realizzare la sicurezza del thread. – Rob