串行队列比同步块快吗?
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 以及等待线程可以为您做多少其他工作。
串行队列比同步块快吗?
我有两种实现线程安全的方法。我已经实施了选项 1,但我的主管希望我实施选项 2。
选项 1:
synchronized fun doSomething(task: Task){
//task.do()
}
选项 2:
fun doSomething(task: Task){
serialQueue.add(task)
}
哪种方法更快,为什么?为什么存在两个版本用于单一目的?
在第一个选项中,调用线程获取调用 doSomething 的对象的锁,然后执行任务,持有锁直到完成。如果另一个线程想要在同一实例上执行相同的方法,则该线程必须等待其他线程的任务 运行 完成才能执行该方法。
在第二个选项中,线程将任务放入队列中。线程在任务执行时不会等待。
使用哪个选项可能会受到多种因素的影响,例如任务需要多长时间、立即完成任务与让它在队列中处理相比有多重要,以及您是否阻塞或 non-blocking 以及等待线程可以为您做多少其他工作。