iOS @synchronized

作者: gaookey | 来源:发表于2020-10-30 10:40 被阅读0次

    OC

    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 块会隐式的添加一个异常处理例程来保护代码,该处理例程会在异常抛出的时候自动的释放互斥锁。所以如果不想让隐式的异常处理例程带来额外的开销,你可以考虑使用锁对象。

    相关文章

      网友评论

        本文标题:iOS @synchronized

        本文链接:https://www.haomeiwen.com/subject/idbamktx.html