Последовательная очередь быстрее синхронизированного блока?

#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: это ТАК, быть разборчивыми — это то, что мы делаем. Спасибо за исправление.