Выбор ответа Senior Flow, StateFlow и SharedFlow обновлено

MutableStateFlow.update и гонки

Вопрос

Почему _state.update { it.copy(count = it.count + 1) } лучше, чем _state.value = _state.value.copy(count = _state.value.count + 1)?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: update атомарен через compare-and-set, изменения не теряются. Чтение value, вычисление и запись это три отдельных шага, и между ними другой поток может изменить состояние, его изменение будет затёрто. update работает в цикле compare-and-set: если значение успело измениться, функция вычисляется заново.

Варианты ответа

  1. update быстрее, потому что не создаёт копию состояния
  2. update атомарен через compare-and-set, изменения не теряютсяправильный ответ
  3. value нельзя присваивать вне Main, а update можно
  4. update отправляет значение, даже если оно не изменилось

Разбор

Чтение value, вычисление и запись это три отдельных шага, и между ними другой поток может изменить состояние, его изменение будет затёрто. update работает в цикле compare-and-set: если значение успело измениться, функция вычисляется заново. Копия создаётся в обоих вариантах, присваивать value можно из любого потока, а одинаковые значения StateFlow не эмитит в обоих случаях.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.