Ответ
В Kotlin для синхронизации доступа корутин к общему ресурсу можно использовать:
- Mutex – блокирует выполнение только одной корутины:
val mutex = Mutex()
var counter = 0
launch {
mutex.withLock {
counter++
}
}
- Атомарные типы (AtomicInteger и др.) для простых операций:
val counter = AtomicInteger(0)
launch { counter.incrementAndGet() }
- Actor – корутина с очередью сообщений:
val counterActor = actor<Int> {
var counter = 0
for (msg in channel) { counter += msg }
}
-
Потокобезопасные коллекции (ConcurrentHashMap и др.)
-
@Volatile для примитивов (но не гарантирует атомарность сложных операций)
Mutex предпочтительнее для сложных операций, атомарные типы – для простых инкрементов.