关于在 MainQueue 中调用 sync 会造成死锁

首先需要明白 Queue 与 Thread 之间的关系。
SerialQueue 是串行队列, 有一个线程与之对应。
ConcurrencyQueue 为并发队列, 并发队列会根据 queue 中的 Task 数量与执行情况开启一个或多个线程。

synchronize 同步方法会阻塞当前线程,并在 sync 所需要执行的 Task 执行完之后重新激活当前线程。

因此, 当在 SerialQueue 的线程里向该 SerialQueue 中 sync 一个 Task 时,会挂起该 SerialQueue 所在的线程,等待该 Task 执行完毕。但该 Task 需要在该线程中执行,由于该线程已被挂起,所以 Task 永远不会被执行完毕。造成死锁。
(同理可理解至 MainQueue 中的情况)

在 ConcurrencyQueue 中 sync 一个 Task 时,会挂起执行中的线程, 另开辟一个线程去执行该 Task ,故不会造成死锁。

你可能感兴趣的:(关于在 MainQueue 中调用 sync 会造成死锁)