串行队列比同步块快吗?

Is serial queue faster then synchronized block?

串行队列比同步块快吗?

我有两种实现线程安全的方法。我已经实施了选项 1,但我的主管希望我实施选项 2。

选项 1:

synchronized fun doSomething(task: Task){
    //task.do()
}

选项 2:

fun doSomething(task: Task){
    serialQueue.add(task)
}

哪种方法更快,为什么?为什么存在两个版本用于单一目的?

在第一个选项中,调用线程获取调用 doSomething 的对象的锁,然后执行任务,持有锁直到完成。如果另一个线程想要在同一实例上执行相同的方法,则该线程必须等待其他线程的任务 运行 完成才能执行该方法。

在第二个选项中,线程将任务放入队列中。线程在任务执行时不会等待。

使用哪个选项可能会受到多种因素的影响,例如任务需要多长时间、立即完成任务与让它在队列中处理相比有多重要,以及您是否阻塞或 non-blocking 以及等待线程可以为您做多少其他工作。