zoukankan      html  css  js  c++  java
  • iOS多线程方案锁的学习总结

    1.OSSpinLock(自旋锁,有优先级翻转问题已摒弃)

    //导入头文件
    #import <libkern/OSAtomic.h>
    //初始化锁
    OSSpinLock lock = OS_SPINLOCK_INIT;
    //加锁
    OSSpinLockLock(&_lock);
    //解锁
    OSSpinLockUnlock(&_lock);

    2.os_unfair_lock(iOS10以后替代OSSpinLock)

    //导入头文件
    #import <os/lock.h>
    //初始化锁
    os_unfair_lock lock = OS_UNFAIR_LOCK_INIT;
    //加锁
    os_unfair_lock_lock(&_lock);
    //解锁
    os_unfair_lock_unlock(&_lock);

    3.pthread_mutex_t(互斥锁)

    //导入头文件
    #import <pthread.h>
    //初始化锁属性
    pthread_mutexattr_t mutexattr;
    pthread_mutexattr_init(&mutexattr);
    pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_NORMAL);
    //初始化锁
    pthread_mutex_t mutex;
    pthread_mutex_init(&_mutex, &mutexattr);
    //加锁
    pthread_mutex_lock(&_mutex);
    //解锁
    pthread_mutex_unlock(&_mutex);
    //销毁
    pthread_mutexattr_destroy(&_mutexattr);
    pthread_mutex_destroy(&_mutex);

    4.NSLock、NSRecursiveLock

    //初始化
    self.lock = [[NSLock alloc]init];
    //加锁
    [self.lock lock];
    //解锁
    [self.lock unlock];

    5.NSCondition、NSConditionLock(条件锁、处理线程依赖场景)

    //初始化锁
    self.condition = [[NSCondition alloc] init];
    //加锁
    [self.condition lock];
    //条件
    if (self.data.count == 0) {
            // 等待(这时锁是解开的状态)
            [self.condition wait];
        }
    //信号(唤醒等待)
    [self.condition signal];
    //解锁
    [self.condition unlock];

    6.dispatch_semaphore_t(信号量)

    dispatch_semaphore_t semaphore = dispatch_semaphore_create(5);
    // 如果信号量的值 > 0,就让信号量的值减1,然后继续往下执行代码
    // 如果信号量的值 <= 0,就会休眠等待,直到信号量的值变成>0,就让信号量的值减1,然后继续往下执行代码
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    dispatch_semaphore_signal(semaphore);

    7.dispatch_queue_t(同步串行队列)

    dispatch_queue_t sigQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
    dispatch_sync(self.sigQueue, ^{
            ...
    });

    8.@synchronized

    @synchronized([self class]) { 
            ...
    } 

    总结各种锁性能从高到低

  • 相关阅读:
    7-20 (样卷)统计单词的个数 (40 分)
    7-21 删除字符 (30 分)
    7-19 计算有n个字符串中最长的字符串长度 (40 分)
    7-16 列表数字元素加权和(1) (40 分)
    7-17 列表元素个数的加权和(1) (40 分)
    7-15 求出歌手的得分 (40 分)
    7-10 jmu-python-异常-学生成绩处理基本版 (15 分)
    7-11 jmu-python-分段函数&数学函数 (15 分)
    7-12 产生每位数字相同的n位数 (30 分)
    7-9 jmu-python-异常-学生成绩处理专业版 (25 分)
  • 原文地址:https://www.cnblogs.com/zk1947/p/14621067.html
Copyright © 2011-2022 走看看