me encontré con esto en el Mike Ash "Cuidado y alimentación de los hijos únicos" y estaba un poco Puzzeled por su comentario:Mike Ash Singleton: Colocación @synchronized
Este código es un poco lento, sin embargo. Tener un candado es algo costoso. Haciéndolo más doloroso es el hecho de que la gran mayoría de las veces, el bloqueo no tiene sentido. El bloqueo es solo necesario cuando foo es nulo, lo que básicamente solo ocurre una vez. Después de que se inicializa el singleton , la necesidad de se ha ido, pero la cerradura en sí permanece.
+(id)sharedFoo {
static Foo *foo = nil;
@synchronized([Foo class]) {
if(!foo) foo = [[self alloc] init];
}
return foo;
}
Mi pregunta es, y no hay duda de una buena razón para esto, pero ¿por qué no se puede escribir (véase más adelante) para limitar la cerradura para cuando foo es nulo?
+(id)sharedFoo {
static Foo *foo = nil;
if(!foo) {
@synchronized([Foo class]) {
foo = [[self alloc] init];
}
}
return foo;
}
aplausos gary
Ah bien, así que básicamente necesita un chequeo dentro del bloque @synchronize? – fuzzygoat
Ese es el objetivo de @synchronized: permitir un hilo a la vez para realizar la comprobación. –
Pruebe dispatch_once() en su lugar: http://stackoverflow.com/q/5720029/290295 – ctpenrose