@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
,因此无论如何都没有要排斥的东西,但是不应盲目地将该代码复制到其他地方。