iOS中常用的几种锁

275 阅读1分钟
  1. 自旋锁
    NSSpinLock ,它现在被废弃了,不能使用了,它是有缺陷的,会造成死锁。当低优先级线程访问了锁并执行了任务,这时恰好高的优先级线程也访问了锁,因为它的优先级较高,所以要优先执行任务,所以它会不停的访问该锁,并使得cpu大部分都用来访问该锁忙等了,造成低优先级的线程没有足够的cpu时机来执行任务,这样造成了死锁。
  2. 互斥锁
    p_thread_mutex,NSLock,@synthronized这个顺序是按照性能排序的,也是我们常用的几个互斥锁。
  3. 递归锁
    NSRecursiveLock,它是递归锁,它允许我们进行多次锁。
  4. 条件锁
    NSCondition,条件锁我们调用wait方法就把当前线程进入等待状态,当调用了signal方法就可以让该线程继续执行,也可以调用broadcast广播方法。
  5. 信号量
    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);
    });
}