锁的原因
多个线程读 没问题
多个线程 写 可能有问题
边读边写 也有问题
边写边读 也有问题
锁就是保证 读的时候不写。写的时候不读。并且只有一个在写
保证每次只有一个线程访问这一块资源,锁 应运而生
@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种锁以及性能对比
网友评论