1. GCD
1. 同步/異步 串行/并發(fā)
dispatch_sync(serial_queue, ^{//任務(wù)})
dispatch_async(serial_queue, ^{//任務(wù)})
dispatch_sync(concurrent_queue, ^{//任務(wù)})
dispatch_async(concurrent_queue, ^{//任務(wù)})
image
- 死鎖
- 原因
- 隊列引起的循環(huán)等待
- 主隊列中所提交的任務(wù)無論是同步方式還是異步方式蟋软,都要在主線程中執(zhí)行
-
同步提交的任務(wù)蛙讥,不論是提交到并發(fā)還是串行隊列,都在當(dāng)前線程執(zhí)行
image
- 原因
image
image
image
image
2. dispatch_barrier_async
-
并發(fā)隊列實現(xiàn)多讀單寫
image
3. dispatch_group
// 創(chuàng)建一個group
dispatch_group_t group = dispatch_group_create();
// for循環(huán)遍歷各個元素執(zhí)行操作
for (NSURL *url in arrayURLs) {
// 異步組分派到并發(fā)隊列當(dāng)中
dispatch_group_async(group, concurrent_queue, ^{
//根據(jù)url去下載圖片
NSLog(@"url is %@", url);
});
}
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 當(dāng)添加到組中的所有任務(wù)執(zhí)行完成之后會調(diào)用該Block
NSLog(@"所有圖片已全部下載完成");
});
2. NSOperation
配合NSOperationQueue實現(xiàn)多線程方案
- 特點
- 可以添加任務(wù)依賴
- 任務(wù)執(zhí)行狀態(tài)控制
- 狀態(tài)
- isReady
- isExecuting
- isFinished
- isCancelled
- 如果只重寫main方法,底層控制變更任務(wù)執(zhí)行完成狀態(tài),以及任務(wù)退出
- 如果重寫了start方法照藻,自行控制任務(wù)狀態(tài)
- 狀態(tài)
- 最大并發(fā)量
- 支持KVO
3. NSThread
-
啟動流程
image - 結(jié)合Runloop實現(xiàn)常駐線程
- Start方法
4. 多線程與鎖
- iOS中的鎖
- @synchronized
- 一般在創(chuàng)建單例對象的時候使用
- atomic
- 修飾屬性的關(guān)鍵字
-
對被修飾對象進行原子操作(不負(fù)責(zé)使用)
image
- OSSpinLock
- 自旋鎖
- 循環(huán)等待詢問免钻,不釋放當(dāng)前資源
- 用于輕量級數(shù)據(jù)訪問彼水,簡單的int值+1/-1操作
-
NSLock
image -
NSRrecursiveLock - 遞歸鎖image
- dispatch_semaphore_t - 信號量
- dispatch_semaphore_create(1)
-
內(nèi)部實現(xiàn)
image
-
- dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
-
內(nèi)部實現(xiàn)邏輯
image
-
- dispatch_semaphore_signal(semaphore)
-
內(nèi)部
image
-
- dispatch_semaphore_create(1)
- @synchronized