Ho appena creato un metodo singleton e vorrei sapere cosa fa la funzione @synchronized(), poiché la uso frequentemente, ma non ne conosco il significato.
Risposte:
Dichiara una sezione critica attorno al blocco di codice. Nel codice multithread, @synchronizedgarantisce che solo un thread possa eseguire quel codice nel blocco in un dato momento.
Se non sei a conoscenza di ciò che fa, probabilmente la tua applicazione non è multithread e probabilmente non hai bisogno di usarla (specialmente se il singleton stesso non è thread-safe).
Modifica: aggiunta di ulteriori informazioni che non erano nella risposta originale del 2011.
La @synchronizeddirettiva impedisce a più thread di entrare in qualsiasi regione di codice protetta da una @synchronizeddirettiva che fa riferimento allo stesso oggetto . L'oggetto passato alla @synchronizeddirettiva è l'oggetto utilizzato come "blocco". Due thread possono trovarsi nella stessa area di codice protetta se un oggetto diverso viene utilizzato come blocco ed è inoltre possibile proteggere due aree di codice completamente diverse utilizzando lo stesso oggetto del blocco.
Inoltre, se ti capita di passare nilcome oggetto di blocco, non verrà preso alcun blocco.
@synchronized.
Dalla documentazione Apple qui e qui :
La direttiva @synchronized è un modo conveniente per creare blocchi mutex al volo nel codice Objective-C. La direttiva @synchronized fa ciò che farebbe qualsiasi altro blocco mutex: impedisce a thread diversi di acquisire lo stesso blocco allo stesso tempo.
La documentazione fornisce numerose informazioni su questo argomento. Vale la pena dedicare del tempo a leggerlo, soprattutto dato che lo usi senza sapere cosa sta facendo.
La @synchronizeddirettiva è un modo conveniente per creare blocchi mutex al volo nel codice Objective-C .
La @synchronizeddirettiva fa ciò che farebbe qualsiasi altro blocco mutex: impedisce a thread diversi di acquisire lo stesso blocco allo stesso tempo.
Sintassi:
@synchronized(key)
{
// thread-safe code
}
Esempio:
-(void)AppendExisting:(NSString*)val
{
@synchronized (oldValue) {
[oldValue stringByAppendingFormat:@"-%@",val];
}
}
Ora il codice sopra è perfettamente thread-safe. Ora più thread possono modificare il valore.
Quanto sopra è solo un oscuro esempio ...
@synchronized(val, oldValue) { ... }?
Il blocco @synchronized gestisce automaticamente il blocco e lo sblocco per te . @synchronize hai un blocco implicito associato all'oggetto che stai usando per sincronizzare. Ecco una discussione molto istruttiva su questo argomento, per favore segui Come funziona il blocco / sblocco @synchronized in Objective-C?
Ottima risposta qui:
Aiuta a comprendere il metodo di classe che restituisce singleton
con ulteriore spiegazione del processo di creazione di un singleton.
@synchronizedè il thread safemeccanismo. Il pezzo di codice scritto all'interno di questa funzione diventa la parte di critical sectioncui può essere eseguito un solo thread alla volta.
@synchronizeapplica il blocco in modo implicito mentre lo NSLockapplica in modo esplicito.
Assicura solo la sicurezza del thread, non lo garantisce. Quello che voglio dire è che assumi un autista esperto per la tua auto, ma non garantisce che l'auto non incontrerà un incidente. Tuttavia la probabilità rimane la minima.
@synchronizedesso non fa nulla: rimani senza protezione. 2)@synchronizedè lento .