所謂死鎖撼嗓,是指兩個或兩個以上的線程在執(zhí)行過程中,因爭奪資源(數(shù)據(jù)源欢唾、內(nèi)存等且警,變量不是資源)而造成的一種相互等待的現(xiàn)象,若無外部處理作用礁遣,它們都將無限等待下去斑芜。
四個必備條件:
- 互斥:所謂互斥就是線程在某一時間內(nèi)獨占資源。如果此時還有其它進程請求資源祟霍,則請求者只能等待杏头,直至占有資源的進程用畢釋放。
- 請求與保持:指線程已經(jīng)保持至少一個資源沸呐,但又提出了新的資源請求醇王,而該資源已被其它進程占有,此時請求進程阻塞崭添,但又對自己已獲得的其它資源保持不放寓娩。
- 不剝奪:指線程已獲得的資源,在未使用完之前,不能被剝奪棘伴,只能在使用完時由自己釋放寞埠。
- 環(huán)路等待:指在發(fā)生死鎖時,必然存在一個線程——資源的環(huán)形鏈焊夸。
開發(fā)中碰到的死鎖:
- 在GCD中仁连,主要的死鎖就是當(dāng)前串行隊列里面同步執(zhí)行當(dāng)前串行隊列。解決的方法就是將同步的串行隊列放到另外一個線程執(zhí)行阱穗。
- 兩個串行隊列A怖糊、B,其中A是B的目標(biāo)隊列颇象,這樣隊列之間會形成層級體系伍伤,B中的任務(wù)稍候都會在A中一次執(zhí)行,于是排在AB中的任務(wù)都是在A中串行執(zhí)行遣钳,這時如果在隊列B中的塊中扰魂,判斷當(dāng)前隊列不是A那么就認為可以在隊列A上執(zhí)行同步派發(fā)操作,實際上會導(dǎo)致死鎖蕴茴。
解決方案:隊列特有數(shù)據(jù)劝评。 - 互斥鎖在已獲得鎖的情況下再次請求鎖,線程會因為等待鎖的釋放而進入睡眠狀態(tài)倦淀,因此就不可能再釋放鎖蒋畜,從而導(dǎo)致死鎖。