(Kotlin/코틀린) AtomicBoolean 사용 방법

✨ 개요

안드로이드/코틀린 개발을 하다 보면 다음과 같은 요구사항이 자주 등장합니다.

이때 가장 적합한 도구가 바로 AtomicBoolean입니다.


1. 요약


2. AtomicBoolean 이 필요한 이유

var isRunning = false

if (!isRunning) {
    isRunning = true
    doWork()
}

멀티스레드 환경에서는:

val isRunning = AtomicBoolean(false)

if (isRunning.compareAndSet(false, true)) {
    doWork()
}

3. AtomicBoolean 기본 API

3.1 get/set

val flag = AtomicBoolean(false)

flag.get()      // 현재 값 조회
flag.set(true) // 값 설정

3.2 compareAndSet (가장 중요 ⭐)

flag.compareAndSet(expect = false, update = true)

“현재 값이 false라면 true로 바꾸고, 성공하면 true를 반환”

  • 단일 원자 연산
  • lock 없이 구현(CPU CAS 명령)

3.3 getAndSet

val previous = flag.getAndSet(true)

4. 실무 패턴

4-1. 앱 최초 1회 초기화

private val initialized = AtomicBoolean(false)

fun initOnce() {
    if (initialized.compareAndSet(false, true)) {
        initSdk()
    }
}

4-2. 중복 클릭 방지

private val isProcessing = AtomicBoolean(false)

fun onButtonClick() {
    if (!isProcessing.compareAndSet(false, true)) return

    doAsyncWork {
        isProcessing.set(false)
    }
}

5. AtomicBoolean vs synchronized vs volatile

구분 AtomicBoolean synchronized volatile
원자성
락 사용
성능 매우 좋음 상대적으로 느림 좋음
복합 연산 안전 ⭕ (CAS)
단순 가시성 보장


Related Posts