CAS

νŠΉμ • λ©”λͺ¨λ¦¬ μœ„μΉ˜μ˜ 값을 λΉ„κ΅ν•˜κ³ , μ˜ˆμƒν•˜λŠ” 값이 μΌμΉ˜ν•˜λ©΄ μƒˆλ‘œμš΄ κ°’μœΌλ‘œ κ΅μ²΄ν•˜λŠ” 연산이닀.

  1. 인자둜 κΈ°μ‘΄ κ°’, μƒˆλ‘œμš΄ 값을 전달

  2. κΈ°μ‘΄ 값이 ν˜„μž¬ λ©”λͺ¨λ¦¬μ˜ κ°’κ³Ό κ°™λ‹€λ©΄ μƒˆλ‘œμš΄ κ°’μœΌλ‘œ ꡐ체

  3. ꡐ체 성곡 μ—¬λΆ€λ₯Ό λ°˜ν™˜

비ꡐ + ꡐ체 두 개의 μ—°μ‚°μœΌλ‘œ λ³΄μ΄μ§€λ§Œ, μ΄λŠ” ν•˜λ“œμ›¨μ–΄ μˆ˜μ€€μ—μ„œ μ²˜λ¦¬ν•  수 μžˆμ–΄ μ›μžμ μœΌλ‘œ λ™μž‘ν•˜λ©°, λ™μ‹œμ— μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— CAS 연산을 μˆ˜ν–‰ν•΄λ„ λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

Javaμ—μ„œμ˜ CAS

java.util.concurrent.atomic νŒ¨ν‚€μ§€μ—μ„œ μ œκ³΅ν•˜λŠ” Atomic ν΄λž˜μŠ€λ“€μ€ CAS 연산을 μ§€μ›ν•œλ‹€. CAS 연산은 Atomic 클래슀의 λ©”μ„œλ“œλ‘œ κ΅¬ν˜„λ˜μ–΄ 있으며, 각 νƒ€μž…μ— λŒ€μ‘ν•˜λŠ” ν΄λž˜μŠ€κ°€ μ œκ³΅λœλ‹€.(AtomicInteger, AtomicLong, AtomicBoolean λ“±)

public class CASExample {

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

        int expectedValue = 0;
        int newValue = 1;

        boolean success = atomicInt.compareAndSet(expectedValue, newValue);
        System.out.println("CAS 성곡 μ—¬λΆ€: " + success);
        System.out.println("ν˜„μž¬ κ°’: " + atomicInt.get());
    }
}

Atomicκ³Ό volatile

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

public class AtomicInteger extends Number implements java.io.Serializable {

    private static final long serialVersionUID = 6214790243416807050L;

    // ...

    private volatile int value;

    // ...
}

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

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

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

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

vs 락 기반 동기화

μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— ν•˜λ‚˜μ˜ μžμ›μ— μ ‘κ·Όν•  λ•Œ, 락 기반 동기화와 CAS 방식 두 κ°€μ§€ 방법을 μ‚¬μš©ν•  수 μžˆλ‹€.

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

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

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

μ ‘κ·Ό 방식

비관적(pessimistic)

낙관적(optimistic)

λ™μž‘ 원리

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

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

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

적합

뢀적합

좩돌 μ‹œ 처리

λŒ€κΈ°

μž¬μ‹œλ„

Last updated

Was this helpful?