Supponendo che si stia tentando di sincronizzare l'interazione con questo oggetto myID
nella coda di sfondo, si desidera il contrario, il blocco all'interno del blocco inviato. In questo momento si dispone di:
@synchronized(myID) {
dispatch_async(queue, ^{
// do stuff with myID
});
}
Ecco sincronizzare il processo di aggiunta del blocco inviato alla coda, ma lo fa non sincronizzare quello che stai facendo in background. Sospetto che non sia quello che intendevi.
Probabilmente destinato:
dispatch_async(queue, ^{
@synchronized(myID) {
// do stuff with myID
}
});
Sembra molto simile, ma i risultati in un comportamento completamente diverso. Ora, il lavoro inviato alla coda in background è in fase di sincronizzazione.
Come ulteriore affinamento, se questo inviato blocco è forse lento (e presumo che sia), allora si sarebbe probabilmente per vincolare la @synchronized
blocco il più possibile:
dispatch_async(queue, ^{
// do slow stuff in preparation for interacting with `myID`
@synchronized(myID) {
// quickly do stuff with myID
}
// do anything else here
});
Se eseguire tutto il blocco in background all'interno di un blocco @synchronized
, è possibile annullare l'intero scopo di inviarlo allo sfondo, ovvero minimizzare l'impatto sulla coda principale. Quest'ultima interpretazione mitiga quel problema.
Come osservazione finale, se si dispone di una coda seriale (o di una coda concorrente non globale in cui si esegue l'aggiornamento con una barriera), viene spesso utilizzata come tecnica che elimina del tutto la necessità di serrature, a patto che tutti gli aggiornamenti e le richieste per myID
vengono inviati a quella coda. Vedere Eliminating Lock-Based Code nella Guida alla programmazione simultanea .
Cosa stai cercando di ottenere? – Wain
BTW, ho ragione a ritenere che tu non sia _non_ reinstantiating 'myID' in nessun punto? Il blocco '@ synchronized' è unico per quella particolare istanza dell'oggetto puntata da' myID', non dalla variabile in generale. – Rob