iOS面试-NSOperation、自旋和互斥锁

NSOperationQueue的优点

  1. 可以添加任务以来,方便控制执行顺序
  2. 可以设定操作执行的优先级
  3. 任务执行状态控制:isReady、isExecuting、isFinished、isCancelled
  4. 可以设置最大并发量

  • 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