OC-开发案例收集

iOS @synchronized

2020-10-30  本文已影响0人  gaookey

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

上一篇 下一篇

猜你喜欢

热点阅读