Verwendet @synchronized nicht "Sperren" und "Entsperren", um einen gegenseitigen Ausschluss zu erreichen? Wie sperrt / entsperrt es dann?
Die Ausgabe des folgenden Programms ist nur "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];
}
lockObjekt wird bei jedem Aufruf erstellt, sodass es niemals einen Fall gibt, in dem ein @synchronizedBlock einen anderen sperrt. Und das bedeutet, dass es keinen gegenseitigen Ausschluss gibt.) Natürlich führt das obige Beispiel die Operation in aus main, daher gibt es sowieso nichts auszuschließen, aber man sollte diesen Code nicht blind an eine andere Stelle kopieren.