一、多線程的基本概念
1.進(jìn)程:可以理解成一個(gè)運(yùn)行中的應(yīng)用程序,是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ),主要管理資源。
2.線程:是進(jìn)程的基本執(zhí)行單元,一個(gè)進(jìn)程對(duì)應(yīng)多個(gè)線程。
3.主線程:處理UI,所有更新UI的操作都必須放在主線程上執(zhí)行。不要把耗時(shí)操作放在主線程,會(huì)卡主界面。
4.多線程:在同一時(shí)刻,一個(gè)CPU只能處理一條線程,但CPU可以在多條線程之間快速的切換,只要切換的時(shí)間足夠快,就造成了多線程一同執(zhí)行的假象。
5. 線程就像火車的一節(jié)車廂,進(jìn)程則是火車。車廂(線程)離開(kāi)火車(進(jìn)程)是無(wú)法跑動(dòng)的,而火車(進(jìn)程)至少有一節(jié)車廂(主線程)。多線程可以看做多個(gè)車廂,它的出現(xiàn)是為了提高效率。
6.多線程是通過(guò)提高資源使用率來(lái)提高系統(tǒng)總體的效率。
7.我們運(yùn)用多線程的目的是:將耗時(shí)的操作放在后臺(tái)執(zhí)行!
8.串行和并發(fā):
串行的意思是在多個(gè)任務(wù)下,每次只會(huì)有一個(gè)任務(wù)被執(zhí)行,并發(fā)的意思是同一時(shí)間多個(gè)任務(wù)同時(shí)發(fā)生。并發(fā)是一種現(xiàn)象,解決并發(fā)現(xiàn)象的技術(shù),叫做并行。
我們經(jīng)常說(shuō)的多線程編程,說(shuō)的就是并行技術(shù),可以讓多個(gè)CPU同時(shí)執(zhí)行,加快執(zhí)行速度,提高執(zhí)行效率。
9.同步和異步:
同步的意思是在多任務(wù)中,一個(gè)任務(wù)只能等待另一個(gè)任務(wù)完成之后,他才可以進(jìn)行,而異步的意思是一個(gè)任務(wù)的執(zhí)行,不需要等待上一個(gè)任務(wù)的執(zhí)行,不會(huì)發(fā)生堵塞。
10.死鎖:
死鎖就是指兩條線程互相都在等待對(duì)方執(zhí)行完畢,才能進(jìn)入下一步操作。由于兩條線程都不能執(zhí)行下一步,所以造成死鎖,卡住不動(dòng)了。
11.競(jìng)態(tài)條件:發(fā)生在多個(gè)線程試圖訪問(wèn)共享資源時(shí),這會(huì)導(dǎo)致意想不到的結(jié)果。通過(guò)使用同步,能夠保護(hù)資源免受線程間共享的影響。
二、線程安全問(wèn)題
當(dāng)多個(gè)線程訪問(wèn)同一塊資源時(shí),很容易引發(fā)數(shù)據(jù)錯(cuò)亂和數(shù)據(jù)安全問(wèn)題。
解決多線程安全問(wèn)題的辦法:
1.方法一:互斥鎖(同步鎖)
@synchronized(鎖對(duì)象) {
//需要鎖定的代碼
}
判斷的時(shí)候鎖對(duì)象要存在,如果代碼中只有一個(gè)地方需要加鎖,大多都使用self作為鎖對(duì)象,這樣可以避免單獨(dú)再創(chuàng)建一個(gè)鎖對(duì)象。
加了互斥做的代碼,當(dāng)新線程訪問(wèn)時(shí),如果發(fā)現(xiàn)其他線程正在執(zhí)行鎖定的代碼,新線程就會(huì)進(jìn)入休眠。
2.方法二:自旋鎖:
加了自旋鎖,當(dāng)新線程訪問(wèn)代碼時(shí),如果發(fā)現(xiàn)現(xiàn)有其他線程正在鎖定代碼,新線程會(huì)用死循環(huán)的方式,一直等待鎖定的代碼執(zhí)行完成。相當(dāng)于不停的嘗試執(zhí)行代碼,比較消耗性能。
屬性修飾atomic本身就有一把自旋鎖。
nonatomic 非原子屬性,同一時(shí)間可以有很多線程讀和寫
atomic 原子屬性(線程安全),保證同一時(shí)間只有一個(gè)線程能夠?qū)懭?但是同一個(gè)時(shí)間多個(gè)線程都可以取值),atomic 本身就有一把鎖(自旋鎖)
atomic:線程安全,需要消耗大量的資源
nonatomic:非線程安全,不過(guò)效率更高,一般使用nonatomic
參考文章:
http://www.cocoachina.com/ios/20170707/19769.html
http://www.cocoachina.com/ios/20170623/19617.html
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。