Какие знаешь альтернативы Synchronized в Coroutines

«Какие знаешь альтернативы Synchronized в Coroutines» — вопрос из категории Coroutines и Flow, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В корутинах вместо synchronized можно использовать:

  1. Mutex - аналог synchronized, но не блокирует поток:
val mutex = Mutex()
mutex.withLock {
    // критическая секция
}
  1. Actor - модель акторов для безопасного доступа к состоянию:
val counter = actor<Int> {
    var count = 0
    for (msg in channel) {
        count += msg
    }
}
  1. Flow с stateIn - для реактивного подхода:
val stateFlow = flow { /* данные */ }
    .stateIn(viewModelScope, SharingStarted.Lazily, initialValue)
  1. Thread-safe коллекции - например, ConcurrentHashMap

Основные отличия от synchronized:

  • Mutex приостанавливает корутину вместо блокировки потока
  • Можно использовать с таймаутами (tryLock)
  • Поддержка отмены корутин