首先需要明白 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 ,故不會造成死鎖。