You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在并发队列中调用sync方法是否会引发死锁?

并发队列中调用sync是否会引发死锁?

先看大家都熟悉的串行队列死锁场景:在串行队列的异步任务里调用该队列的同步方法,必然会触发死锁。代码示例:

let serialQueue = DispatchQueue(label: "serialQueue")
serialQueue.async {
    serialQueue.sync {
        // deadlock
    }
}

原因很直白:串行队列只能按顺序执行任务,外层async任务先占了队列的执行权,它里面的sync任务又要求立刻在这个串行队列上执行,可队列此时正被外层任务占着,两边互相等对方让位置,直接卡死。

那换成并发队列的情况呢?看这段代码:

let concurrentQueue = DispatchQueue(label: "concurrentQueue", attributes: .concurrent)
concurrentQueue.async {
    concurrentQueue.sync {
        // deadlock?
    }
}

一般情况下:不会死锁

并发队列允许同时执行多个任务,外层的async任务在某个线程执行时,内部的sync任务可以被调度到线程池里的其他空闲线程执行,完全不用等外层任务释放队列,所以不会出现互相阻塞的情况,自然不会死锁。

关于“线程复用会不会导致死锁”的疑问

有人会担心:如果线程池把sync任务分配到了async任务所在的同一个线程,会不会引发阻塞死锁?

答案是不会。GCD的并发队列处理sync任务时有特殊逻辑:当检测到当前线程已经在执行该并发队列的任务时,sync任务会直接在当前线程同步执行——也就是外层的async任务暂时停一下,先把内部的sync任务跑完,再继续自己的流程。全程不会出现队列被堵、互相等待的情况,根本触发不了死锁。

内容的提问来源于stack exchange,提问作者Enkidu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:12:31