6-4 锁与多线程

锁的原因

多个线程读 没问题

多个线程 写 可能有问题

边读边写 也有问题 
边写边读  也有问题 

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

@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 锁与多线程)