【发布时间】:2010-11-15 23:09:51
【问题描述】:
@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中进行操作,所以无论如何也没有什么可以排除的,但不要盲目地将代码复制到其他地方。 -
在阅读了这个 SO 页面后,我决定更彻底地调查 @synchronized 并写一篇关于它的博客文章。您可能会发现它很有用:rykap.com/objective-c/2015/05/09/synchronized
标签: objective-c synchronization