Czy @synchronized nie używa "blokady" i "odblokowania", aby osiągnąć wzajemne wykluczenie? Jak działa blokowanie/odblokowywanie?W jaki sposób @synchronized lock/unlock w Objective-C?
Dane wyjściowe tego programu to tylko "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];
}
Uwaga: Powiązane z http://stackoverflow.com/questions/1215765/ –
Nie trzeba przesłonić init, jeśli nie jest to potrzebne. Środowisko wykonawcze automatycznie wywoła implementację nadklasy, jeśli nie zastąpi się metody. –
Należy pamiętać, że powyższy kod nie jest zsynchronizowany. Obiekt 'lock' jest tworzony przy każdym wywołaniu, więc nigdy nie będzie przypadku, w którym jeden blok' @ synchronized' blokuje inny. A to oznacza, że nie ma wzajemnego wykluczenia.) Oczywiście, powyższy przykład wykonuje operację w 'main', więc i tak nie ma nic do wykluczenia, ale nie należy ślepo kopiować tego kodu gdzie indziej. –