日常开发中,都使用过哪些锁?

1.@synchronized

一般在创建单例对象的时候使用,多线程环境下创建线程是唯一的。

2.atomic

修饰属性的关键字,对被修饰对象进行原子操作(不负责使用)

@property(atomic) NSMutableArray *array;
//这样保证线程的安全性
self.array = [NSMutableArray array];
//不能保证线程安全的
[self.array addObject:obj];

3.OSSpinLock(自旋锁)

循环等待访问,不释放当前资源,用于轻量级数据访问(引用计数+1/-1操作)

4.NSLock(对象锁)

-(void)A{
    [lock lock];
    [self B];
    [lock unlock];
}

-(void)B{
   [lock lock];
   //操作逻辑
   [lock unlock];
}

//导致死锁

  • 使用NSLock 对临界区加锁处理的时候,当前某个线程调用lock之后,获取得到锁
  • 到B方法后,同一把锁又获取了一次,导致了死锁
    //解决方案
    通过递归锁NSRecursiveLock

5.NSRecursiveLock(递归锁)

-(void)A{
    [recursiveLock lock];
    [self B];
    [recursiveLock unlock];
}

-(void)B{
   [recursiveLock lock];
   //操作逻辑
   [recursiveLock unlock];
}

递归锁的特点就是重入

6.dispatch_semaphore_t(信号量)

dispatch_semaphore_create(1);
dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER);
dispatch_semaphore_signal(semaphore);

你可能感兴趣的:(日常开发中,都使用过哪些锁?)