实现多线程的四种方案
线程安全
场景:多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题。
解决方法
- 互斥锁(同步锁)
@synchronized(锁对象) {
// 需要锁定的代码
}
复制代码
判断的时候锁对象要存在,如果代码中只有一个地方需要加锁,大多都使用self作为锁对象,这样可以避免单独再创建一个锁对象。
加了互斥做的代码,当新线程访问时,如果发现其他线程正在执行锁定的代码,新线程就会进入休眠。
- 自旋锁
加了自旋锁,当新线程访问代码时,如果发现有其他线程正在锁定代码,新线程会用死循环的方式,一直等待锁定的代码执行完成。相当于不停尝试执行代码,比较消耗性能。
属性修饰atomic本身就有一把自旋锁。
NSThread、NSOperation、GCD应用
- NSThread
面向对象,轻量级
- NSOperation
面向对象,基于GCD的更高层封装,提供的方便操作:最大并发数(GCD可使用信号量控制并发数),队列的暂停 / 继续,取消所有的操作,指定操作间的依赖关系(GCD中可以异步嵌套同步实现)
- GCD
提供了一些NSOperation不具备的功能:延迟操作(dispatch_after),一次性执行(dispatch_once)与调度组(创建组,给组里添加任务并指明队列,通过notify获取组的完成通知,执行任务完成后操作)