21 / 06 / 20

@synchronized

  • Objective-C
NSObject *obj = [[NSObject alloc] init];

dispatch_async(dispatch_get_global_queue(0, 0), ^{
    
    @synchronized (obj) {
        NSLog(@"线程同步的操作1 开始");
        sleep(3);
        NSLog(@"线程同步的操作1 结束");
    }
});

dispatch_async(dispatch_get_global_queue(0, 0), ^{
    sleep(1);
    @synchronized (obj) {
        NSLog(@"线程同步的操作2");
    }
});
  • Swift
let obj = NSObject()

DispatchQueue.global().async {
    
    objc_sync_enter(obj)
    print("线程同步的操作1 开始")
    sleep(3)
    print("线程同步的操作1 结束")
    objc_sync_exit(obj)
}

DispatchQueue.global().async {
    sleep(1)
    objc_sync_enter(obj)
    print("线程同步的操作2")
    objc_sync_exit(obj)
}
  • 执行结果
线程同步的操作1 开始
线程同步的操作1 结束
线程同步的操作2

@synchronized(obj) 指令使用的 obj 为该锁的唯一标识,只有当标识相同时,才为满足互斥,如果线程2中的 @synchronized(obj) 改为 @synchronized(self),刚线程2就不会被阻塞,@synchronized 指令实现锁的优点就是我们不需要在代码中显式的创建锁对象,便可以实现锁的机制,但作为一种预防措施,@synchronized 块会隐式的添加一个异常处理例程来保护代码,该处理例程会在异常抛出的时候自动的释放互斥锁。所以如果不想让隐式的异常处理例程带来额外的开销,你可以考虑使用锁对象。