【问题标题】:Is serial queue faster then synchronized block?串行队列比同步块更快吗?
【发布时间】:2021-01-18 04:19:16
【问题描述】:

串行队列比同步块快吗?

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

选项 1:

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

选项 2:

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

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

【问题讨论】:

    标签: ios multithreading asynchronous queue thread-safety


    【解决方案1】:

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

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

    使用哪个选项会受到多种因素的影响,例如任务需要多长时间、现在完成任务而不是让它通过队列处理的重要性,以及您是阻塞还是非阻塞以及等待线程可以为您做多少其他工作。

    【讨论】:

    • 在队列中删除任务应该是恒定的时间。 可能不是恒定,因为访问该队列必须以某种方式同步 - 要么也使用锁,或通过无锁算法。但两者都没有恒定的运行时复杂性。 (是的,我在这里有点挑剔。;)无论哪种方式,重要的部分是正如您正确解释的那样,工作被 卸载 到某个工作线程。
    • @mpoeter:就是这样,挑剔是我们的工作。谢谢指正。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    相关资源
    最近更新 更多