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

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

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

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

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容