美文网首页
iOS都有哪些锁

iOS都有哪些锁

作者: Li_Po | 来源:发表于2020-10-17 10:55 被阅读0次
    • iOS都有哪些锁:synchronized 、atomic、oSSpinLook、NSLock、dispatch_semaphore_t
    • synchronized

    例如创建单例使用 + (instancetype)sharedInstance
    {
    static LockTest * shareLockTest = nil;
    //锁
    @synchronized (self) {//创建单例队形使用
    if (!shareLockTest) {
    shareLockTest = [[LockTest alloc] init];
    }
    }
    return shareLockTest;
    }
    //扩展GCD创建单例
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
    shareLockTest = [[self alloc] init];
    });

    • atomic 修饰属性关键字,对被修饰对象进行原子操作(不负责使用)

    例如:
    @property (atomic,strong)NSMutableArray * array;
    [NSMutableArray array] 安全的,
    [array addObject:]是不安全

    • oSSpinLook 自旋锁,

    SpinLook_t是“忙等”的锁。
    循环等待访问(whele),不释放当前资源,用于轻量级数据访问
    例如: int类型的引用计数加1减1操作

    • NSLock

    [NSLock lock] [NSLock unlock] 重入会死锁 可以使用递归锁解决

    *NSRecursiveLock 递归锁

    [NSRecursiveLock lock] [NSRecursiveLock unlock]

    • dispatch_semaphore_t 信号量

    1:dispatch_semaphore_create(0) => 创建一个信号量
    内部结构体
    struct semaphore{
    int Value;//信号信号量
    List <thresd>;线程列表
    }
    2: dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) => 等待信号。信号量-1
    {
    S.value = S.value-1;
    if S.value<0 then Block(S.list);//阻塞是一个主动行为 当信号量为0的时候主动阻塞
    }
    3: dispatch_semaphore_signal(semaphore) => 发送一个信号 信号量+1 唤醒
    {
    S.value = S.value+1;
    if S.value<=0 then wakeup(S.list); //唤醒是一个被动行为 当有信号量的时候唤醒线程
    }

    iOS常用的十个锁示例

    https://www.jianshu.com/p/33b608903488

    相关文章

      网友评论

          本文标题:iOS都有哪些锁

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