objective-c - 在 Objective-C 中 @synchronized 如何锁定/解

@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 一样。语义上存在一些小的技术差异,但将它们视为在一个通用(更原始)实体之上实现的两个独立接口(interface)基本上是正确的。

尤其是 NSLock 你有一个显式锁,而 @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;
}

这并不完全正确,因为实际的转换更复杂并使用递归锁,但它应该明白这一点。

关于objective-c - 在 Objective-C 中 @synchronized 如何锁定/解锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1215330/

相关文章:

objective-c - 迭代时从 NSMutableArray 中删除的最佳方法?

ios - 使用 iOS 将文本复制到剪贴板

iphone - 接收者类型 *** 例如消息是前向声明

ios - 从父 iOS 访问容器 View Controller

ios - 缩放 MKMapView 以适应注释图钉?

ios - Xcode下架构x86_64的重复符号

objective-c - 如何在标题更改时停止不需要的 UIButton 动画?

objective-c - Xcode 4.4 发行说明中提到的 "Objective-C Lite

ios - 有没有办法遍历字典?

ios - 在代码中为 UIButton 设置图像