Ответ
В корутинах есть несколько способов синхронизации:
- Mutex – блокирует доступ к общему ресурсу, пока одна корутина его использует:
val mutex = Mutex()
var counter = 0
launch {
mutex.withLock {
counter++
}
}
- Actor – корутина с очередью сообщений, обрабатывающая запросы последовательно:
val counterActor = actor<Int> {
var counter = 0
for (msg in channel) {
counter += msg
}
}
-
Flow с buffer – использование
buffer()илиconflate()для управления обработкой элементов. -
SharedFlow/StateFlow – потоковые решения с горячими данными, поддерживающие нескольких подписчиков.
-
Semaphore – ограничивает количество корутин, одновременно работающих с ресурсом.
-
Thread-safe коллекции – например,
ConcurrentHashMapилиAtomicInteger.