iOS锁

常见锁代码

多线程场景不可避免需要使用锁来解决数据竞争、并发访问等问题,iOS 开发中,你会接触到各种各样的锁,不同的锁有不同的使用场景和性能差异。这里记录下各种锁及其使用方法,方便的大家查询使用。

自旋锁

    // 自旋锁,性能最高,但已被证明不再安全
   {
        OSSpinLock lock = OS_SPINLOCK_INIT;
        for (int i = 0; i < count; i++) {
            OSSpinLockLock(&lock);
            // 待加锁的代码
            OSSpinLockUnlock(&lock);
        }
    }

信号量锁

    // 信号量锁,性能较高
    {
        dispatch_semaphore_t lock =  dispatch_semaphore_create(1);
        for (int i = 0; i < count; i++) {
            dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
            // 待加锁的代码
            dispatch_semaphore_signal(lock);
        }
    }

互斥锁

    // 互斥锁,性能较高
    {
        pthread_mutex_t lock;
        pthread_mutex_init(&lock, NULL);
        for (int i = 0; i < count; i++) {
            pthread_mutex_lock(&lock);
            // 待加锁的代码
            pthread_mutex_unlock(&lock);
        }
    }

条件锁

    // 条件锁
    {
        NSCondition *lock = [NSCondition new];
        for (int i = 0; i < count; i++) {
            [lock lock];
            // 待加锁的代码
            [lock unlock];
        }
    }

普通锁

    // 普通锁
    {
        NSLock *lock = [NSLock new];
        for (int i = 0; i < count; i++) {
            [lock lock];
            // 待加锁的代码
            [lock unlock];
        }
    }

递归锁

    // 递归锁
    {
        NSRecursiveLock *lock = [NSRecursiveLock new];
        for (int i = 0; i < count; i++) {
            [lock lock];
            // 待加锁的代码
            [lock unlock];
        }
    }

条件锁

    // 条件锁
    {
        NSConditionLock *lock = [[NSConditionLock alloc] initWithCondition:1];
        for (int i = 0; i < count; i++) {
            [lock lock];
            // 待加锁的代码
            [lock unlock];
        }
    }

其它

    // 普通锁,性能最差
    {
        NSObject *lock = [NSObject new];
        for (int i = 0; i < count; i++) {
            @synchronized(lock) {
                   // 待加锁的代码
            }
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 我的博客, 各位看官有时间赏光 锁 我们在使用多线程的时候多个线程可能会访问同一块资源,这样就很容易引发数据错乱和...
    VIC_LI阅读 1,544评论 0 36
  • 各种锁的性能较 锁是用来保证线程安全的一种机制,也是保持数据同步的一种必要手段。是确保一段代码在同一个时间只能允许...
    Kk太阳阅读 336评论 0 2
  • 一、互斥锁 百度百科:在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" ...
    MangK阅读 7,508评论 1 29
  • 前言 iOS开发中由于各种第三方库的高度封装,对锁的使用很少,刚好之前面试中被问到的关于并发编程锁的问题,都是一知...
    喵渣渣阅读 3,733评论 0 33
  • 阳光明媚,冬日里难得的好天气。连着半个月的阴雨,终于等来天晴,村子里勤快的女人赶忙将被褥洗洗刷刷,拿出来晒晒。...
    妃君子阅读 751评论 5 4