¿@synchronized no usa "bloquear" y "desbloquear" para lograr la exclusión mutua? ¿Cómo se bloquea/desbloquea?¿Cómo se bloquea/desbloquea @synchronized en Objective-C?
La salida del siguiente programa es solo "Hello World".
@interface MyLock: NSLock<NSLocking>
@end
@implementation MyLock
- (id)init {
return [super init];
}
- (void)lock {
NSLog(@"before lock");
[super lock];
NSLog(@"after lock");
}
- (void)unlock {
NSLog(@"before unlock");
[super unlock];
NSLog(@"after unlock");
}
@end
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
MyLock *lock = [[MyLock new] autorelease];
@synchronized(lock) {
NSLog(@"Hello World");
}
[pool drain];
}
Nota: relacionado con http://stackoverflow.com/questions/1215765/ –
No es necesario anular init si no lo necesita. El tiempo de ejecución llama automáticamente a la implementación de la superclase si no anula un método. –
Una cosa importante a tener en cuenta es que el código anterior no está sincronizado. El objeto 'lock' se crea en cada llamada, por lo que nunca habrá un caso en el que un bloque' @ synchronized' bloquee a otro. Y esto significa que no hay exclusión mutua.) Por supuesto, el ejemplo anterior está haciendo la operación en 'main', por lo que no hay nada que excluir de todos modos, pero no se debe copiar ciegamente ese código en otro lugar. –