compare-and-swap

  • 일명 CAP

  • atomic instruction used in multi-threading to achieve synchronization

  • 특정 값이 (false), 예상한 값 (false) 과 같다면 새로운 값으로 치환하는 방법.

  • 만약에 특정 값이 (true), 예상한 값(false) 과 다르면 해당 치환작업은 실패함이 보장됨.

code

  • java8

  • java.util.concurrent.atomic.AtomicInteger#incrementAndGet

    // sun.misc.Unsafe#getAndAddInt
    public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
            var5 = this.getIntVolatile(var1, var2);
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

        return var5;
    }
  • var5 는 volatile value

    • 반환하는 건 초기값 (e.g = 1)

  • val1 는 AtomicInteger 클래스

  • var2 는 valueOffSet

    • The offset is just used to determine which memory location to address when updating the value field of AtomicInteger instances.

    • AtomicInteger 인스턴스가 가지고 있는 value값의 주소인듯.

  • compareAndSwapInt CAS 기법으로, do-while문을 돌면서 현재 메인 메모리가 가지고 있는 값이 var5와 같으면 var5 + var4(1) 해서 set하고 아니면 계속 돌듯.

    • 돌다가 어느정도 지나면 튕기겠지..?

참고

  • https://www.digitalocean.com/community/tutorials/atomicinteger-java

  • https://www.javacodemonk.com/what-is-atomicinteger-class-and-how-it-works-internally-1cda6a56

  • https://www.baeldung.com/java-volatile

  • https://www.geeksforgeeks.org/volatile-keyword-in-java/#:~:text=For%20Java%2C%20%E2%80%9Cvolatile%E2%80%9D%20tells,scope%20of%20the%20program%20itself.

Last updated