- 自旋锁
NSSpinLock ,它现在被废弃了,不能使用了,它是有缺陷的,会造成死锁。当低优先级线程访问了锁并执行了任务,这时恰好高的优先级线程也访问了锁,因为它的优先级较高,所以要优先执行任务,所以它会不停的访问该锁,并使得cpu大部分都用来访问该锁忙等了,造成低优先级的线程没有足够的cpu时机来执行任务,这样造成了死锁。 - 互斥锁
p_thread_mutex,NSLock,@synthronized这个顺序是按照性能排序的,也是我们常用的几个互斥锁。 - 递归锁
NSRecursiveLock,它是递归锁,它允许我们进行多次锁。 - 条件锁
NSCondition,条件锁我们调用wait方法就把当前线程进入等待状态,当调用了signal方法就可以让该线程继续执行,也可以调用broadcast广播方法。 - 信号量
semphone在一定程度也可以当互斥锁用,它适用于编程逻辑更复杂的场景,同时它也是除了自旋锁以为性能最高的锁。
- (void)mutexLock{
//pthread_mutex
pthread_mutex_t mutex;
pthread_mutex_init(&mutex,NULL);
pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);
//NSLock
NSLock *lock = [[NSLock alloc] init];
lock.name = @"lock";
[lock lock];
[lock unlock];
//synchronized
@synchronized (self) {
}
}
- (void)RecursiveLock{
NSRecursiveLock *lock = [NSRecursiveLock alloc];
[lock lock];
[lock lock];
[lock unlock];
}
- (void)conditionLock{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
condition = [[NSCondition alloc] init];
[condition wait];
NSLog(@"finish----");
});
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[NSThread sleepForTimeInterval:5.0];
[condition signal];
});
}
- (void)semaphore{
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"semaphoreFinish---");
});
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[NSThread sleepForTimeInterval:5.0];
dispatch_semaphore_signal(semaphore);
});
}
复制代码
转载于:https://juejin.im/post/5cf6353ce51d45776031afb3