• OC中实现锁


     熟悉多线程开发的同学对锁肯定不陌生,但是OC中如何实现锁呢?给大家科普一下。 

     首先构建一个测试用的类,假想它是我们的一个共享资源,method1与method2是互斥的,代码如下:

    @implementation TestObj
    - (void)method1
    {
        NSLog(@"%@",NSStringFromSelector(_cmd));
    }
    - (void)method2
    {
        NSLog(@"%@",NSStringFromSelector(_cmd));    
    }
    @end

    1.使用NSLock实现的锁

     

    //主线程中
    TestObj *obj = [[TestObj alloc] init];
    NSLock *lock = [[NSLock alloc] init];
    //线程1
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [lock lock];
        [obj method1];
        sleep(10);
        [lock unlock];
    });
    //线程2
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        sleep(1);//以保证让线程2的代码后执行
        [lock lock];
        [obj method2];
        [lock unlock];
    });

    2.使用synchronized关键字构建的锁

    当然在Objective-C中你还可以用@synchronized指令快速的实现锁:

    //主线程中
    TestObj *obj = [[TestObj alloc] init];
    //线程1
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        @synchronized(obj){
            [obj method1];
            sleep(10);
        }
    });
    //线程2
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        sleep(1);
        @synchronized(obj){
            [obj method2];
        }
    });

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

    3.使用GCD来实现的”锁”
    以上代码构建多线程我们就已经用到了GCD的dispatch_async方法,其实在GCD中也已经提供了一种信号机制,使用它我们也可以来构建一把”锁”(从本质意义上讲,信号量与锁是有区别,具体差异参加信号量与互斥锁之间的区别):

    //主线程中
    TestObj *obj = [[TestObj alloc] init];
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
    //线程1
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        [obj method1];
        sleep(10);
        dispatch_semaphore_signal(semaphore);
    });
    //线程2
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        sleep(1);
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        [obj method2];
        dispatch_semaphore_signal(semaphore);
    });

    参考资料:http://www.tanhao.me/pieces/616.html/

  • 相关阅读:
    大数据学习——yum练习安装jdk
    大数据学习——shell编程
    wps左侧显示目录
    大数据学习——Linux上常用软件安装
    大数据学习
    大数据学习——课后练习一
    大数据学习——:wq不能退出vi编辑器
    大数据学习——linux常用命令(五)
    安装SecureCRT注册
    大数据学习——linux常用命令(二)四
  • 原文地址:https://www.cnblogs.com/6duxz/p/6869212.html
Copyright © 2020-2023  润新知