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

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);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 锁是一种同步机制,用于多线程环境中对资源访问的限制iOS中常见锁的性能对比图(摘自:ibireme): iOS锁的...
    LiLS阅读 1,562评论 0 6
  • 在平时的开发中经常使用到多线程,在使用多线程的过程中,难免会遇到资源竞争的问题,那我们怎么来避免出现这种问题那? ...
    IAMCJ阅读 3,149评论 2 25
  • 补充: 可以看到除了OSSpinLock外,dispatch_semaphore和pthread_mutex性能是...
    笨坨阅读 3,564评论 0 10
  • 自旋锁和互斥锁 共同点:都能保证同一时刻只能有一个线程操作锁住的代码。都能保证线程安全。不同点: 互斥锁(mute...
    中轴线_lz阅读 752评论 0 0
  • 三行诗 我用了蕴藏一个冬天的力气 才开出几枝花儿 被你们折了 打油诗 槐花好吃树难栽, 随便乱折太不该。 美化环境...
    caoxia阅读 540评论 5 14