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