#ios #multithreading #asynchronous #queue #thread-safety
#iOS #многопоточность #асинхронный #очередь #безопасность потоков
Вопрос:
Последовательная очередь быстрее синхронизированного блока?
У меня есть два способа добиться потокобезопасности. Я реализовал вариант-1, но мой руководитель хочет, чтобы я реализовал вариант-2.
Вариант 1:
synchronized fun doSomething(task: Task){
//task.do()
}
Вариант 2:
fun doSomething(task: Task){
serialQueue.add(task)
}
Какой подход быстрее и почему? И почему существуют две версии для одной цели?
Ответ №1:
В первом варианте вызывающий поток получает блокировку объекта, на который вызывается doSomething, затем выполняет задачу, удерживая блокировку до ее завершения. Если другой поток хочет выполнить тот же метод в том же экземпляре, этот поток должен дождаться завершения задач, выполняемых другими потоками, прежде чем он сможет выполнить метод.
Во втором варианте поток помещает задачу в очередь. Поток не задерживается в ожидании во время выполнения задачи.
На какой вариант использования может повлиять несколько факторов, например, сколько времени занимает задача, насколько важно, чтобы задача была выполнена прямо сейчас, а не позволяла ей обрабатываться через очередь, и блокируете ли вы или неблокируете, и сколько другой работы может выполнять ожидающий потокдля вас.
Комментарии:
1. Удаление задачи из очереди должно быть постоянным по времени. Вероятно, не постоянный , поскольку доступ к этой очереди должен быть каким-то образом синхронизирован — либо также с использованием блокировки, либо с помощью алгоритма без блокировки. Но ни один из них не имеет постоянной сложности во время выполнения. (Да, я здесь немного придирчив. 😉 В любом случае, важной частью является то, что работа выгружается в какой-то рабочий поток, как вы правильно объяснили.
2. @mpoeter: это ТАК, быть разборчивыми — это то, что мы делаем. Спасибо за исправление.