iOS面试-NSOperation、自旋和互斥锁
NSOperationQueue的优点
- 可以添加任务以来,方便控制执行顺序
- 可以设定操作执行的优先级
- 任务执行状态控制:isReady、isExecuting、isFinished、isCancelled
可以设置最大并发量
NSOperation
执行的操作,就是期望在线程中执行的代码。在GCD中是放在放在block中的。而在NSOperation中是使用其子类NSIvocationOperation、NSBlockOperation,或者自定义子类来进行操作的封装NSOperationQueue
操作队列,存放操作的队列。和GCD的FIFO不同,NSOperationQueue对于添加到队列中的操作,首先进入准备就绪状态(就绪状态取决于操作之间的依赖关系),然后对进入就绪状态的操作开始执行顺序(非结束顺序)由操作之间相对的优先级决定(优先级是操作对象自身的属性)
操作队列通过设置最大并发数来控制并发、串行。NSOperation
为我们提供了两种队列,主队列和自定义队列。主队列运行在主线程之上,而其他队列都在后台运行。’
NSThread+runloop实现常驻线程
因为每次开辟子线程都会消耗CPU,当需要频繁使用子线程时,就会消耗大量的CPU,而且因为创建线程都是在任务执行完成后就释放了,不能再次利用,这时可以考虑创建一个常驻线程
自旋锁和互斥锁
- 自旋锁:
用于保护多线程共享资源的锁,与一般互斥锁(mutex)不同之处在于当自旋锁尝试获取锁时以 忙等待的形式不断地循环检查锁是否时可用的。当上一个线程的任务没有执行完毕时被锁住,那么下一个线程会一直等待(不会睡眠),当上一线程的任务完成后,下一个线程才会立即执行
在对于多CPU的环境中,对于持有锁的时间较短的程序来说,使用自旋锁代替一般的互斥锁往往能够提高程序的性能 互斥锁:
当上一个线程的任务没有完成时 下一个线程会进入睡眠状态等待任务执行完毕,当上一个线程任务执行完毕,下一个线程会自动唤醒 然后执行任务优缺点:
优点:自旋锁不会引起调用者睡眠,所以不会进行线程调度,CPU时间片轮转等好事操作。所有如果能在短时间内获得锁,自旋锁的效率远高于 互斥锁
缺点:自旋锁会一直占用CPU,在未获得锁的时候,一直运行--"自旋"。所以占用着CPU,如果不能短时间获得锁,无疑会使CPU的效率降低。自旋锁不能实现递归调用
自旋锁:atomic、OSSpinLock、dispatch_semaphore_t
互斥锁:pthread_mutex、@synchronized、NSLock、NSConditionLock 、NSCondition、NSRecursiveLock