CAS

CASλŠ” '비ꡐ ν›„ ꡐ체'λ₯Ό μ˜λ―Έν•˜λ©°, νŠΉμ • λ©”λͺ¨λ¦¬ μœ„μΉ˜μ˜ 값을 μ˜ˆμƒλ˜λŠ” κ°’κ³Ό λΉ„κ΅ν•˜μ—¬, μΌμΉ˜ν•  κ²½μš°μ—λ§Œ μƒˆλ‘œμš΄ κ°’μœΌλ‘œ κ΅μ²΄ν•˜λŠ” μ›μžμ (atomic) 연산이닀.

  • 연산에 ν•„μš”ν•œ μΈμžλŠ” μ˜ˆμƒλ˜λŠ” ν˜„μž¬ κ°’, μƒˆλ‘œμš΄ κ°’, μ‹€μ œ λ©”λͺ¨λ¦¬ μ£Όμ†Œ μ„Έ κ°€μ§€

  • λ©”λͺ¨λ¦¬μ˜ ν˜„μž¬ 값이 μ˜ˆμƒ κ°’κ³Ό μΌμΉ˜ν•˜λŠ”μ§€ 비ꡐ

  • μΌμΉ˜ν•˜λ©΄ λ©”λͺ¨λ¦¬ 값을 μƒˆλ‘œμš΄ κ°’μœΌλ‘œ ꡐ체

  • μΌμΉ˜ν•˜μ§€ μ•ŠμœΌλ©΄ ꡐ체λ₯Ό μˆ˜ν–‰ν•˜μ§€ μ•ŠμŒ

  • 이 λͺ¨λ“  κ³Όμ •μ˜ 성곡 μ—¬λΆ€ λ°˜ν™˜

비ꡐ와 ꡐ체 두 λ‹¨κ³„λ‘œ λ³΄μ΄μ§€λ§Œ, 이 과정은 CPU의 νŠΉλ³„ν•œ λͺ…λ Ήμ–΄(instruction)λ₯Ό 톡해 ν•˜λ“œμ›¨μ–΄ μˆ˜μ€€μ—μ„œ ν•˜λ‚˜μ˜ μ›μžμ  μ—°μ‚°μœΌλ‘œ μ²˜λ¦¬λœλ‹€.

Javaμ—μ„œμ˜ CAS

μžλ°”λŠ” java.util.concurrent.atomic νŒ¨ν‚€μ§€λ₯Ό 톡해 CAS 연산을 μ§€μ›ν•œλ‹€.

  • CAS 연산을 Atomic 클래슀의 λ©”μ„œλ“œλ‘œ κ΅¬ν˜„

  • 각 νƒ€μž…μ— λŒ€μ‘ν•˜λŠ” ν΄λž˜μŠ€κ°€ 제곡(AtomicInteger, AtomicLong, AtomicBoolean λ“±)

  • compareAndSet(expectedValue, newValue) λ©”μ„œλ“œλ₯Ό 톡해 CAS μ—°μ‚° μˆ˜ν–‰

public static void main(String[] args) {
    AtomicInteger atomicInt = new AtomicInteger(0);

    int expectedValue = 0;
    int newValue = 1;

    // ν˜„μž¬ 값이 0(expectedValue)이면 1(newValue)둜 ꡐ체
    boolean success = atomicInt.compareAndSet(expectedValue, newValue);

    System.out.println("CAS 성곡 μ—¬λΆ€: " + success); // true
    System.out.println("ν˜„μž¬ κ°’: " + atomicInt.get()); // 1
}

Atomicκ³Ό volatile

Atomic ν΄λž˜μŠ€λŠ” λ‚΄λΆ€μ μœΌλ‘œ volatile ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 멀버 λ³€μˆ˜λ₯Ό μ„ μ–Έν•œλ‹€.

volatile ν‚€μ›Œλ“œλŠ” λ©”λͺ¨λ¦¬ κ°€μ‹œμ„±μ„ 보μž₯ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ”λ°, μ΄λŠ” CAS 연산이 μ˜¬λ°”λ₯΄κ²Œ λ™μž‘ν•˜κΈ° μœ„ν•œ ν•„μˆ˜ 쑰건이닀.

  • volatile ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄, λ³€μˆ˜μ˜ 값을 읽을 λ•Œ CPU μΊμ‹œκ°€ μ•„λ‹Œ 메인 λ©”λͺ¨λ¦¬μ—μ„œ μ½μ–΄μ˜€κ²Œ 됨

  • λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ λͺ¨λ“  μŠ€λ ˆλ“œκ°€ 항상 μ΅œμ‹  값을 읽을 수 μžˆλ„λ‘ 보μž₯

  • CAS 연산은 비ꡐ와 ꡐ체λ₯Ό ν•˜λŠ” λ™μ•ˆ λ©”λͺ¨λ¦¬ 값이 μ •ν™•ν•΄μ•Ό ν•˜λ―€λ‘œ, λ©”λͺ¨λ¦¬ κ°€μ‹œμ„±μ΄ 보μž₯λ˜μ–΄μ•Ό 함

vs 락 기반 동기화

μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ 곡유 μžμ›μ— μ ‘κ·Όν•  λ•Œ, 동기화 방식은 크게 락(Lock) 기반 방식과 CAS 기반 λ°©μ‹μœΌλ‘œ λ‚˜λˆŒ 수 μžˆλ‹€.

  • CAS 방식: κ°„λ‹¨ν•œ μ—°μ‚°κ³Ό 좩돌이 적은 ν™˜κ²½μ— 적합 / 좩돌 λ°œμƒ μ‹œ μž¬μ‹œλ„λ‘œ 인해 μ„±λŠ₯ μ €ν•˜ κ°€λŠ₯

  • 락 기반: λ³΅μž‘ν•œ 동기화 λ‘œμ§μ΄λ‚˜ 좩돌이 λΉˆλ²ˆν•œ ν™˜κ²½μ— 적합 / 락 νšλ“ κ³Όμ •μ—μ„œ κ²½ν•©κ³Ό λŒ€κΈ° λ°œμƒ κ°€λŠ₯

νŠΉμ§•
락(Lock) 방식
CAS(Compare-And-Swap) 방식

μ ‘κ·Ό 방식

비관적(pessimistic)

낙관적(optimistic)

λ™μž‘ 원리

락 νšλ“ ν›„ 데이터 μ ‘κ·Ό

κ°’ 비ꡐ ν›„ 쑰건 만쑱 μ‹œ ꡐ체

λ³΅μž‘ν•œ 동기화 처리

적합

뢀적합

좩돌 μ‹œ 처리

λŒ€κΈ°

μž¬μ‹œλ„

Last updated

Was this helpful?