@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]; }
Objective-C 语言级别的同步使用互斥锁,就像这样NSLock做一样。语义上存在一些小的技术差异,但将它们视为在一个通用(更原始)实体之上实现的两个独立接口基本上是正确的。
NSLock
特别是NSLock你有一个显式锁,而@synchronized你有一个与你用来同步的对象关联的隐式锁。语言级锁定的好处是编译器可以理解它,因此它可以处理范围问题,但在机械上它们的行为基本相同。
@synchronized
您可以将其@synchronized视为编译器重写:
- (NSString *)myString { @synchronized(self) { return [[myString retain] autorelease]; } }
转化为:
- (NSString *)myString { NSString *retval = nil; pthread_mutex_t *self_mutex = LOOK_UP_MUTEX(self); pthread_mutex_lock(self_mutex); retval = [[myString retain] autorelease]; pthread_mutex_unlock(self_mutex); return retval; }
这并不完全正确,因为实际的转换更复杂并且使用递归锁,但它应该明白这一点。