GCD
-
同步異步, 串行并發(fā)
- 同步串行:
dispatch_sync(serial_queue, ^{ // work; })
- 異步串行:
dispatch_async(serial_queue, ^{ // work; })
- 同步并發(fā):
dispatch_sync(concurrent_queue, ^{ // work; })
- 異步并發(fā):
dispatch_async(concurrent_queue, ^{ // work; })
-
- 當(dāng)perform...afterDelay:方法的內(nèi)部實現(xiàn), 是向當(dāng)前線程的Runloop中添加事件, 因為GCD底層沒有提供runloop, 所以該方法不會被執(zhí)行
-
- 同步串行:
-
dispatch_barrier_async: 異步柵欄調(diào)用, 用來處理多讀單寫系統(tǒng)層級的解決方案
- 怎樣實現(xiàn)多讀單寫? 怎樣利用GCD實現(xiàn)多讀單寫?(多線程對于共享數(shù)據(jù)的訪問問題)
-
讀與讀并發(fā), 讀與寫互斥, 寫與寫互斥
-
dispatch_group的使用和理解:
NSOperation
-
- 實現(xiàn)多線程的優(yōu)勢和特點(diǎn):
- 可以為任務(wù)添加依賴
- 任務(wù)的執(zhí)行狀態(tài)控制
- 可以控制哪些任務(wù)狀態(tài)?
- isReady: 當(dāng)前任務(wù)是否處于就緒狀態(tài)
- isExecuting: 正在執(zhí)行中
- isFinished: 是否已完成
- isCancel: 是否已取消
- 可以控制哪些任務(wù)狀態(tài)?
-
- 狀態(tài)控制
- 如果只重寫main方法, 底層控制變更任務(wù)執(zhí)行完成狀態(tài), 以及任務(wù)退出
- 如果重寫start方法, 自行控制任務(wù)狀態(tài), 因為在start方法, 系統(tǒng)幫我們控制了任務(wù)的狀態(tài)
-
- 系統(tǒng)是如何移除一個isFinished=YES的NSOperation的?
- 通過KVO
- 可以設(shè)置最大并發(fā)量
NSThread
-
- 內(nèi)部實現(xiàn)機(jī)制:
多線程與鎖
- 鎖的分類:
- @synchronized: 在創(chuàng)建單例對象的時候使用, 來保證再多線程的情況下創(chuàng)建對象是唯一的
- 在創(chuàng)建單例對象的時候使用, 來保證再多線程的情況下創(chuàng)建對象是唯一的
- 創(chuàng)建一個常駐線程的時候需要對線程進(jìn)行加鎖
- atomic: 屬性關(guān)鍵字; 對被修飾的對象進(jìn)行原子操作, 不負(fù)責(zé)使用, 負(fù)責(zé)賦值
- OSSpinLock: 自旋鎖 -> 循環(huán)等待詢問, 不釋放當(dāng)前資源; 用于輕量級數(shù)據(jù)訪問, 簡單的int值+/-操作
- NSLock: 解決細(xì)粒度的線程同步問題,來保證各個線程互斥, 來進(jìn)入自己的臨界區(qū)
- NSRecursiveLock: 遞歸鎖, 可以重入
- dispach_semaphore_t: 信號量
-
dispach_semaphore_create()
: 結(jié)構(gòu)體中包含 信號量的值 和 線程列表 -
dispach_semaphore_wait(semaphore, DIS)
: -
dispach_semaphore_singal() :
- @synchronized: 在創(chuàng)建單例對象的時候使用, 來保證再多線程的情況下創(chuàng)建對象是唯一的
多線程面試總結(jié)
- 怎樣利用GCD實現(xiàn)多讀單寫?
- iOS為我們提供的幾種多線程技術(shù)各自都有哪些特點(diǎn)?
- NSOperation對象在Finished之后是怎樣從queue中移除的?
- 你都用過哪些鎖, 結(jié)合實際談?wù)勀闶侨绾问褂玫? !!!!