關(guān)于在 MainQueue 中調(diào)用 sync 會造成死鎖

首先需要明白 Queue 與 Thread 之間的關(guān)系。
SerialQueue 是串行隊(duì)列, 有一個線程與之對應(yīng)。
ConcurrencyQueue 為并發(fā)隊(duì)列, 并發(fā)隊(duì)列會根據(jù) queue 中的 Task 數(shù)量與執(zhí)行情況開啟一個或多個線程。

synchronize 同步方法會阻塞當(dāng)前線程,并在 sync 所需要執(zhí)行的 Task 執(zhí)行完之后重新激活當(dāng)前線程。

因此, 當(dāng)在 SerialQueue 的線程里向該 SerialQueue 中 sync 一個 Task 時,會掛起該 SerialQueue 所在的線程,等待該 Task 執(zhí)行完畢。但該 Task 需要在該線程中執(zhí)行,由于該線程已被掛起,所以 Task 永遠(yuǎn)不會被執(zhí)行完畢。造成死鎖。
(同理可理解至 MainQueue 中的情況)

在 ConcurrencyQueue 中 sync 一個 Task 時,會掛起執(zhí)行中的線程, 另開辟一個線程去執(zhí)行該 Task ,故不會造成死鎖。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容