Разве @synchronized не использует «блокировку» и «разблокировку» для достижения взаимного исключения? Как это делает блокировку / разблокировку тогда?
Вывод следующей программы - только «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];
}
lock
Объект создается при каждом вызове, так что никогда не будет случай , когда один @synchronized
блок блокирует другой. И это означает, что взаимного исключения не существует.) Конечно, в приведенном выше примере выполняется операция main
, поэтому в любом случае исключать нечего, но не следует слепо копировать этот код в другом месте.