dispatch_once_f(dispatch_once_t val, void ctxt, dispatch_function_t func)傳入了三個(gè)參數(shù)ctxt是外部傳入的block的指針,func是block里具體執(zhí)行的函數(shù)。
創(chuàng)新互聯(lián)建站自2013年創(chuàng)立以來(lái),先為三山等服務(wù)建站,三山等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為三山企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
dispatch類似生產(chǎn)者消費(fèi)者模式,通過監(jiān)聽系統(tǒng)內(nèi)核對(duì)象,在生產(chǎn)者生產(chǎn)數(shù)據(jù)后自動(dòng)通知相應(yīng)的dispatch隊(duì)列執(zhí)行,后者充當(dāng)消費(fèi)者。通過系統(tǒng)級(jí)調(diào)用,更加精準(zhǔn)。
不會(huì),寫單例的時(shí)候你已經(jīng)寫了如果為空才創(chuàng)建。
單例對(duì)象可以在程序啟動(dòng)時(shí)創(chuàng)建并緩存在內(nèi)存中,以便在需要時(shí)快速訪問和更新。正確使用GCDGCD(GrandCentralDispatch)是一個(gè)強(qiáng)大的多線程框架,可以幫助iOS開發(fā)者輕松實(shí)現(xiàn)異步執(zhí)行和線程安全。
1、自旋鎖:線程一直是running(加鎖——解鎖),死循環(huán)(忙等 do-while)檢測(cè)鎖的標(biāo)志位,機(jī)制不復(fù)雜。
2、NSLock -- 互斥鎖 NSCondition -- 互斥鎖 生產(chǎn) -- 消費(fèi) 與NSLock同樣遵守NSLocking的協(xié)議,有同樣的lock、unlock的api。NSConditionLock -- 互斥鎖 是基于NSCondition進(jìn)一步封裝,自帶條件。
3、lockBeforeDate:方法會(huì)在所指定Date之前嘗試加鎖,如果在指定時(shí)間之前都不能加鎖,則返回NO。
4、NSConditionLock 用于需要根據(jù)一定條件滿足后進(jìn)行 加鎖/解鎖.首先看下API 下面就看一下適用場(chǎng)景 此鎖可以在同一線程中多次被使用,但要保證加鎖與解鎖使用平衡,多用于遞歸函數(shù),防止死鎖。
5、如果等待鎖的優(yōu)先級(jí)較高,它會(huì)一直占用著CPU的資源,優(yōu)先級(jí)低的線程就無(wú)法釋放鎖。 在iOS10被蘋果廢棄。
6、所以就可以分成:串行隊(duì)列同步執(zhí)行、串行隊(duì)列異步執(zhí)行、并行隊(duì)列同步執(zhí)行、并行隊(duì)列異步執(zhí)行。GCD實(shí)現(xiàn)原理:GCD有一個(gè)底層線程池,這個(gè)池中存放的是一個(gè)個(gè)的線程。
線程的不安全是由于多線程訪問和修改共享資源而引起的不可預(yù)測(cè)的結(jié)果。 ios多線程開發(fā)中為保證線程的安全常用到的幾種鎖: NSLock 、 dispatch_semaphore 、 NSCondition 、 NSRecursiveLock 、 @synchronized 。
自旋鎖:線程一直是running(加鎖——解鎖),死循環(huán)(忙等 do-while)檢測(cè)鎖的標(biāo)志位,機(jī)制不復(fù)雜。
分類:隊(duì)列分為串行、并行、主隊(duì)列、全局隊(duì)列。任務(wù)的執(zhí)行是在線程上去執(zhí)行的。分為同步和異步。所以就可以分成:串行隊(duì)列同步執(zhí)行、串行隊(duì)列異步執(zhí)行、并行隊(duì)列同步執(zhí)行、并行隊(duì)列異步執(zhí)行。
1、分類:隊(duì)列分為串行、并行、主隊(duì)列、全局隊(duì)列。任務(wù)的執(zhí)行是在線程上去執(zhí)行的。分為同步和異步。所以就可以分成:串行隊(duì)列同步執(zhí)行、串行隊(duì)列異步執(zhí)行、并行隊(duì)列同步執(zhí)行、并行隊(duì)列異步執(zhí)行。
2、分析: 這個(gè)案例沒有使用系統(tǒng)提供的串行或并行隊(duì)列,而是自己通過 dispatch_queue_create 函數(shù)創(chuàng)建了一個(gè) DISPATCH_QUEUE_SERIAL 的串行隊(duì)列。執(zhí)行任務(wù)1;遇到異步線程,將【任務(wù)同步線程、任務(wù)4】加入串行隊(duì)列中。
3、串行隊(duì)列實(shí)際上是單線程。第二幅圖中使用的并行隊(duì)列,當(dāng)block加到并行隊(duì)列中,不會(huì)等待正在執(zhí)行中的處理,而立即分發(fā)到可用線程中去執(zhí)行。所以block1在等待block2在其他線程中執(zhí)行完畢,然后才執(zhí)行block3。
4、造成主隊(duì)列的相互等待,并非主線程死鎖。死鎖,崩潰。原因與在主線程同步提交主隊(duì)列原因相同。由于串行隊(duì)列的相互等待造成死鎖。隊(duì)列改成并發(fā),可以正常執(zhí)行。上層業(yè)務(wù)異步獲取結(jié)果再調(diào)同步也會(huì)死鎖。
5、NSLock 是OC層封裝底層線程操作來(lái)實(shí)現(xiàn)的一種鎖,繼承NSLocking協(xié)議。不能迭代加鎖,如果發(fā)生兩次lock,而未unlock過,則會(huì)產(chǎn)生死鎖問題。
6、以下是在iOS中進(jìn)行多線程操作數(shù)組時(shí)應(yīng)考慮的一些方法和技術(shù):使用GCD(GrandCentralDispatch):GCD是一種用于多線程編程的技術(shù),可以方便地進(jìn)行異步操作。