Sobes.tech
Junior — Middle

Da li je potrebna sinhronizacija kada 500 korutina koje se pokreću na dispatcherima Main i IO istovremeno menjaju promenljivu?

sobes.tech АИ

Одговор од АИ

Да, синхронизация необходима. Если 500 корутин одновременно изменяют одну и ту же переменную, запущенные на разных диспетчерах (Main и IO), то без синхронизации возможны состояния гонки и некорректные результаты.

В Kotlin корутинах для защиты общих ресурсов можно использовать:

  • Mutex — для блокировки критической секции
  • Atomic переменные из пакета kotlinx.atomicfu или java.util.concurrent.atomic
  • Специальные конструкции, например, withContext(Dispatchers.Default) с последовательным доступом

Пример с Mutex:

val mutex = Mutex()
var counter = 0

suspend fun increment() {
    mutex.withLock {
        counter++
    }
}

Без такой защиты при одновременном доступе переменная может быть повреждена.