关于在|关于在 MainQueue 中调用 sync 会造成死锁
首先需要明白 Queue 与 Thread 之间的关系。
SerialQueue
是串行队列, 有一个线程与之对应。
ConcurrencyQueue
为并发队列, 并发队列会根据 queue 中的 Task 数量与执行情况开启一个或多个线程。
synchronize
同步方法会阻塞当前线程,并在 sync 所需要执行的 Task 执行完之后重新激活当前线程。
因此, 当在 SerialQueue 的线程里向该 SerialQueue 中 sync 一个 Task 时,会挂起该 SerialQueue 所在的线程,等待该 Task 执行完毕。但该 Task 需要在该线程中执行,由于该线程已被挂起,所以 Task 永远不会被执行完毕。造成死锁。
(同理可理解至 MainQueue 中的情况)
【关于在|关于在 MainQueue 中调用 sync 会造成死锁】在 ConcurrencyQueue 中 sync 一个 Task 时,会挂起执行中的线程, 另开辟一个线程去执行该 Task ,故不会造成死锁。