¿@Synchronized no utiliza "bloquear" y "desbloquear" para lograr la exclusión mutua? ¿Cómo se bloquea / desbloquea entonces?
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];
}
lockobjeto se crea en cada llamada, por lo que nunca habrá un caso en el que un @synchronizedbloque bloquee a otro. Y esto significa que no hay exclusión mutua.) Por supuesto, el ejemplo anterior está haciendo la operación main, por lo que no hay nada que excluir de todos modos, pero uno no debe copiar ciegamente ese código en otro lugar.