[kotlin] 코루틴의 동시성 제어

코루틴은 동시에 여러 작업을 처리할 수 있는 경량 스레드로, 안드로이드 앱의 성능을 향상시키는 데 매우 유용합니다. 하지만 동시성을 관리하지 않으면 예기치 않은 동작이 발생할 수 있습니다. 이번 글에서는 코루틴을 사용하여 동시성을 제어하는 방법에 대해 알아보겠습니다.

1. 동시성 문제

코루틴은 기본적으로 동시성을 가정하고 동작합니다. 따라서 여러 코루틴이 공유 자원에 동시에 접근할 때 문제가 발생할 수 있습니다. 이를 해결하기 위해 코루틴은 여러 가지 기능을 제공합니다.

2. Mutex (상호배제)

Mutex상호배제를 제공하는 기능으로, 공유 자원에 한 번에 하나의 코루틴만 접근하도록 보장합니다.

val mutex = Mutex()

viewModelScope.launch {
    mutex.withLock {
        // 공유 자원 접근
    }
}

3. Semaphore (세마포어)

Semaphore동시에 여러 코루틴이 접근을 허용할 수 있는 허용치를 가지는 기능입니다. 특정 작업을 허용하는 데 사용됩니다.

val semaphore = Semaphore(3)

repeat(10) {
    viewModelScope.launch {
        semaphore.withPermit {
            // 작업 수행
        }
    }
}

4. Atomic variables (원자변수)

원자변수를 사용하여 원자적인 연산을 수행할 수 있습니다. 이를 통해 공유 변수를 안전하게 변경할 수 있습니다.

val counter = AtomicInt(0)

viewModelScope.launch {
    counter.incrementAndGet()
}

viewModelScope.launch {
    counter.decrementAndGet()
}

코루틴을 사용하여 동시성을 제어하면 안전하고 효율적으로 여러 작업을 동시에 처리할 수 있습니다. 따라서 앱의 성능을 향상시킬 수 있습니다.

참고 자료