死鎖場景
- (void)viewDidLoad {
[super viewDidLoad];
NSThread *thread = [NSThread currentThread];
NSLog(@"** 當(dāng)前線程:%@ **",thread);
dispatch_sync(dispatch_get_main_queue(), ^{
NSThread *thread = [NSThread currentThread];
NSLog(@"** 主線程:%@ **",thread);
});
}
解釋
一共有 2 個任務(wù)舟肉,任務(wù) A
(正在執(zhí)行源代碼) 是把任務(wù) B
添加到主線程俐筋,并且要等到任務(wù) B
(block中的任務(wù)) 執(zhí)行完畢愉择。但是任務(wù) A
正在占用主線程匪凡,所以任務(wù) B
無法執(zhí)行膊畴。所以任務(wù) A
也無法完成。
同步和異步
1.異步調(diào)度 dispatch_async : 把一個任務(wù)添加到某queue后就馬上離開,而不管任務(wù)在那個queue里的執(zhí)行狀態(tài)
2.同步調(diào)度 dispatch_sync : 把一個任務(wù)添加到某queue后,等這個任務(wù)完成,調(diào)用線程才繼續(xù)執(zhí)行.
所以,異步調(diào)度和同步調(diào)度的區(qū)別不在于被添加的任務(wù)怎樣執(zhí)行,而在于調(diào)用線程是否等待任務(wù)執(zhí)行完病游。
注意:串行 queue 每次只能執(zhí)行一個任務(wù)唇跨,可以使用它來代替鎖,保護共享資源或可變的數(shù)據(jù)結(jié)構(gòu)衬衬,串行queue確保任務(wù)按可預(yù)測的順序執(zhí)行(這是比鎖好的地方)