所謂死鎖,是指兩個(gè)或兩個(gè)以上的線程在執(zhí)行過程中,因爭(zhēng)奪資源(數(shù)據(jù)源、內(nèi)存等,變量不是資源)而造成的一種相互等待的現(xiàn)象,若無外部處理作用,它們都將無限等待下去。
四個(gè)必備條件:
- 互斥:所謂互斥就是線程在某一時(shí)間內(nèi)獨(dú)占資源。如果此時(shí)還有其它進(jìn)程請(qǐng)求資源,則請(qǐng)求者只能等待,直至占有資源的進(jìn)程用畢釋放。
- 請(qǐng)求與保持:指線程已經(jīng)保持至少一個(gè)資源,但又提出了新的資源請(qǐng)求,而該資源已被其它進(jìn)程占有,此時(shí)請(qǐng)求進(jìn)程阻塞,但又對(duì)自己已獲得的其它資源保持不放。
- 不剝奪:指線程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時(shí)由自己釋放。
- 環(huán)路等待:指在發(fā)生死鎖時(shí),必然存在一個(gè)線程——資源的環(huán)形鏈。
開發(fā)中碰到的死鎖:
- 在GCD中,主要的死鎖就是當(dāng)前串行隊(duì)列里面同步執(zhí)行當(dāng)前串行隊(duì)列。解決的方法就是將同步的串行隊(duì)列放到另外一個(gè)線程執(zhí)行。
- 兩個(gè)串行隊(duì)列A、B,其中A是B的目標(biāo)隊(duì)列,這樣隊(duì)列之間會(huì)形成層級(jí)體系,B中的任務(wù)稍候都會(huì)在A中一次執(zhí)行,于是排在AB中的任務(wù)都是在A中串行執(zhí)行,這時(shí)如果在隊(duì)列B中的塊中,判斷當(dāng)前隊(duì)列不是A那么就認(rèn)為可以在隊(duì)列A上執(zhí)行同步派發(fā)操作,實(shí)際上會(huì)導(dǎo)致死鎖。
解決方案:隊(duì)列特有數(shù)據(jù)。 - 互斥鎖在已獲得鎖的情況下再次請(qǐng)求鎖,線程會(huì)因?yàn)榈却i的釋放而進(jìn)入睡眠狀態(tài),因此就不可能再釋放鎖,從而導(dǎo)致死鎖。