美文网首页
6-4 锁与多线程

6-4 锁与多线程

作者: Rumbles | 来源:发表于2019-04-11 22:49 被阅读0次

    锁的原因

    多个线程读 没问题
    
    多个线程 写 可能有问题
    
    边读边写 也有问题 
    边写边读  也有问题 
    
    锁就是保证 读的时候不写。写的时候不读。并且只有一个在写
    保证每次只有一个线程访问这一块资源,锁 应运而生
    

    @synchronized.

    @property(atomic) NSMutableArray *array;
    self.array = [NSMutableArray array]; 保证线程安全
    atomic 保证被赋值对象的线程安全 赋值的是指针 保证指针的线程安全。不保证指针指向内容的线程安全
    不保证  [self.array addObject:obj];
    

    自旋锁。OSSpinLock

    OSSpinLock 自旋锁  自旋锁会忙等: 所谓忙等,即在访问被锁资源时,调用者线程不会休眠,而是不停循环在那里,直到被锁资源释放锁 用于轻量级的数据访问。简单的int +1 / -1的操作 效率会很高  
    

    NSLock 普通锁

    NSLock   普通锁
    - (void)methodA {
        [lock  lock];
        [self methodB];
        [lock unlock];
    }
    
    - (void)methodB {
        [lock  lock];
        [self methodB];
        [lock unlock];
    }
    
    这种锁必须先解锁才能调用。重入的原因导致死锁
    
    1.NSLock:是Foundation框架中以对象形式暴露给开发者的一种锁,(Foundation框架同时提供了NSConditionLock,NSRecursiveLock,NSCondition)NSLock定义如下
    - (void)setDelegate:(AFURLSessionManagerTaskDelegate *)delegate
                forTask:(NSURLSessionTask *)task
    {
        ...
        [self.lock lock];
        self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)] = delegate;
        [delegate setupProgressForTask:task];
        [self addNotificationObserverForTask:task];
        [self.lock unlock];
    }
    

    NSRecursiveLock 递归锁

    可以解决上述的重入的原因导致死锁
    

    dispatch_semaphore_t 信号量

        dispatch_async(quene, ^{
            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
            NSLog(@"run task 1");
            sleep(1);
            NSLog(@"complete task 1");
            dispatch_semaphore_signal(semaphore);
        });
    等待释放。
    

    pthread_mutex

    NSConditionLock 条件锁

    iOS开发中的11种锁以及性能对比

    相关文章

      网友评论

          本文标题:6-4 锁与多线程

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