PHpullh
학습 라이브러리/Kotlin/뮤텍스와 세마포어 (Mutex & Semaphore)

KOTLIN · 비동기

뮤텍스와 세마포어 (Mutex & Semaphore)

코루틴 환경에서 공유 자원에 대한 동기화를 처리합니다. Mutex는 상호 배제, Semaphore는 동시 접근 수를 제한합니다.

비동기고급mutexsemaphoresynchronizationconcurrency

핵심 설명

코루틴 환경에서 공유 자원에 대한 동기화를 처리합니다. Mutex는 상호 배제, Semaphore는 동시 접근 수를 제한합니다.

Kotlin code

import kotlinx.coroutines.*
import kotlinx.coroutines.sync.*

fun main() = runBlocking {
    // Mutex: 하나의 코루틴만 접근
    val mutex = Mutex()
    var counter = 0

    val jobs = List(100) {
        launch(Dispatchers.Default) {
            repeat(1000) {
                mutex.withLock {
                    counter++
                }
            }
        }
    }
    jobs.forEach { it.join() }
    println("카운터: $counter")  // 정확히 100000

    // Semaphore: 동시 접근 수 제한
    val semaphore = Semaphore(3)  // 최대 3개 동시

    val apiJobs = List(10) { i ->
        launch {
            semaphore.withPermit {
                println("API 호출 시작: $i")
                delay(500)
                println("API 호출 완료: $i")
            }
        }
    }
    apiJobs.forEach { it.join() }
}

학습 팁

Mutex는 코루틴을 중단시키지만 스레드를 차단하지 않습니다. synchronized와 달리 코루틴에 안전합니다.

주의할 점

synchronized를 코루틴 내에서 사용하면 스레드가 차단되어 다른 코루틴이 실행되지 못합니다. 반드시 Mutex를 사용하세요.

자주 묻는 질문

뮤텍스와 세마포어 (Mutex & Semaphore)란 무엇인가요?

코루틴 환경에서 공유 자원에 대한 동기화를 처리합니다. Mutex 는 상호 배제, Semaphore 는 동시 접근 수를 제한합니다.

뮤텍스와 세마포어 (Mutex & Semaphore) 학습 시 주의할 점은 무엇인가요?

synchronized 를 코루틴 내에서 사용하면 스레드가 차단되어 다른 코루틴이 실행되지 못합니다. 반드시 Mutex 를 사용하세요.