Вы сказали:
мы можем сказать, что результат будет следующим:
Нет, в лучшем случае вы можете только сказать, что выход будет часто /часто в таком порядке, но это не гарантируется.
Фрагмент кода отправляет код асинхронно в глобальную параллельную очередь, которая запускает его в отдельном рабочем потоке, и, при отсутствии какой-либо синхронизации, вы получаете классическое условие состязания между текущим потоком иэтот рабочий поток.Вы не можете гарантировать последовательность этих print
утверждений, хотя на практике вы часто будете видеть 1
до 2
.
, это один из распространенных вопросов на техническом собеседовании;и по какой-то причине интервьюеры ожидают заключения, что порядок исполнения здесь постоянен.Поэтому (поскольку это не соответствовало моему пониманию) я решил уточнить.
Ваше понимание верно, что последовательность этих двух print
утверждений определенно не гарантируется.
Существуют ли обстоятельства, при которых порядок выполнения будет другим
Пара соображений:
Путем корректировки приоритетов очереди, например,Вы можете изменить вероятность того, что 1
появится до 2
.Но, опять же, это не гарантировано.
Существует множество механизмов для гарантии заказа.
- Вы можете использовать последовательную очередь ... Я понимаюВы не хотели использовать другую / другую очередь, но это, как правило, правильное решение, поэтому любое обсуждение этой темы было бы неполным без этого сценария;
- Вы можете использовать группу рассылки ... вы можете
notify
в глобальной очереди, когда текущая очередь удовлетворяет группе; - Вы можете использовать семафоры отправки ... семафоры - классический ответ на вопрос, но семафоры ИМХО следует использовать экономно, так как это легко сделатьошибки ... плюс блокировка потоков никогда не бывает хорошей идеей;
- Ради полноты следует отметить, что вы действительно можете использовать любой механизм синхронизации , например блокировки.