iOS 高级面试剖析课程-锁
2018-09-04 本文已影响8人
繁华落尽丶lee
![](https://img.haomeiwen.com/i1363078/7fd0b6548d057739.png)
在iOS多线程中,经常会出现资源竞争和死锁的问题。本节将学习iOS中不同的锁。
iOS当中有哪些锁?
@synchronized 常用于单例
atomic 原子性
OSSpinLock 自旋锁
NSRecursiveLock 递归锁
NSLock
dispatch_semaphore_t 信号量
- @synchronized 使用场景:一般在创建单例对象时使用,保证对象在多线程中是唯一的。
- atomic 属性关键字原子性,保证赋值操作是线程安全的,读取操作不能保证线程安全。
- OSSpinLock 自旋锁。特点:循环等待访问,不释放当前资源。常用于轻量级数据访问,简单的int值+1/-1操作。
- NSLock 某个线程A调用lock方法。这样,NSLock将被上锁。可以执行“关键部分”,完成后,调用unlock方法。如果,在线程A 调用unlock方法之前,另一个线程B调用了同一锁对象的lock方法。那么,线程B只有等待。直到线程A调用了unlock。
[lock lock]; //加锁
// 关键部分
[lock unlock]; // 解锁
- NSRecursiveLock 递归锁,特点:递归锁在被同一线程重复获取时不会产生死锁。
- dispatch_semaphore_t 信号量
// 创建信号量结构体对象,含有一个int成员
dispatch_semaphore_create(1);
// 先对value减一,如果小于零表示没有资源可以访问。通过主动行为进行阻塞。
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
// value加1,小于等零表示有队列在排队,通过被动行为进行唤醒
dispatch_semaphore_signal(semaphore);
以上是iOS中的锁,如果想深入研究可以查看下面这些文章:
正确使用多线程同步锁@synchronized()
深入理解iOS开发中的锁
Object-C 多线程中锁的使用-NSLock
不再安全的OSSpinLock
小结
- 怎样用GCD实现多读单写?
- iOS提供几种多线程技术各自的特点?
- NSOperation对象在Finished之后是怎样从队列中移除的?
- 你都用过哪些锁?结合实际谈谈你是怎样使用的?