一、概念
在iOS并发编程中,一些基本概念:
串行(Serial):在固定时间内只能执行单个任务。如主线程只负责UI显示
并发(Concurrent):在固定时间内可以执行多个任务。注意,它和并行(Parallel)的区别在于,并发不会同时执行多个任务,而是通过在任务间不断的切换去完成所有工作
同步(Sync):会把当前的任务加入到队列中,除非任务执行完成,线程才会返回继续运行,也就是说同步会阻塞线程。任务在执行和技术一定遵循先后顺序,即先执行的任务一定先结束
异步(Async):会把当前的任务加入到队列中,但它会立刻返回,无需等任务执行完成,也就是说异步不会阻塞线程,任务在执行和结束不遵循先后顺序。可能先执行的任务后结束,也可能后执行的任务先结束
GCD vs Operation
全局队列的优先级由QoS(Quality of Service)决定。如果不制定优先级,就是默认(default)优先级。另外还有(按照优先级顺序从低到高排列):
Background:用来处理特别好使的后台操作,例如同步、数据持久化
Utility:用来处理需要一点时间而又不需要立刻返回结果的操作。特别适用于网路加载、计算、输入输出等
Default:默认优先级。一般来说开发者应该指定优先级。属于特殊情况
User-Interactive:用来处理用户交互的操作。一般用于主线程,如果不及时响应就可能阻塞主线程的操作
😂😂😂😂😂😂😂😂
Unspecified:未确定优先级,由系统根据不同环境推断。比如使用过时的API不支持优先级,此时就可以设定为未确定优先级。属于特殊情况
其实,Operation作为NSObject的子类,一般用于单独的任务。我们将其继承重写之后加入到OperationQueue中运行。iOS提供BlockOperation子类去执行多个代码片段。相比GCD,Operation最主要的特点在于拥有暂停、继续、终止等多个可控状态,可以更加灵活的适应并发编程的场景
二、线程同步策略
iOS多线程,线程同步的方式
在多个线程访问同一块资源时,我们要使用一些线程同步的方法,来保护线程资源的安全及正确性
常用的有:
NSLock
NSCondition
NSConditionLock(条件锁)
@synchronized
dispatch_semaphore
NSRecursiveLock(递归锁)
OSSpinLock
这些实现机制不同,性能自然也不一样
网友评论