038 Cas Algorithm

강의 메모 - CAS (Compare and Swap) 이해와 활용 - 1,2 #

개요 #

  • CAS(Compare and Swap, 비교 후 치환) 는 멀티 스레드 환경에서 스레드 간의 경쟁 조건을 방지하고 락을 사용하지 않고도 공유 변수의 값을 원자적으로 변경하는 방법을 제공한다
  • CAS 는 CPU 캐시와 메인메모리의 두 값을 비교하고 그 값이 동일할 경우 새로운 값으로 교체하는 동기화 연산으로 여러 스레드가 공유하는 메모리 영역을 보호하는 데 사용된다
  • CAS 는 락 기반의 동기화보다 경량화되어 있으며 락을 사용하지 않기 때문에 대기하지 않는 넌블록킹 실행이 가능하고 경쟁 조건과 데드락을 피할 수 있다
  • CAS는 조건에 따라 실패하고 다시 시도해야 할 수 있기 때문에 동시적으로 접근하는 요청의 수가 많은 경쟁 조건일 경우 효율성이 저하될 수 있다
  • CAS는 주로 하드웨어 수준(CPU) 에서 지원되는 연산이며 Java에서는 java.util.concurrent.atomic 패키지에 있는 원자적 연산을 통해 CAS를 지원하고 있다
    • 우리가 별도로 동기화 해 줄 필요가 없다.

img.png

  • T1이 main 메모리에서 100을 가져갔을때, T2가 중간에 동일한 100을 가지고 300이라는 새로운 값으로 메모리에 저장을 한 상황이 오면,
    • 다시 T1이 로직을 수행하려고 할때, 200이랑 300이 같지 않으므로 취소된다.

CAS 동작 방식 #

  • 세 가지 핵심 매개변수

    • 변수의 현재 메인 메모리 값 (Value; this.counter)
    • 변수의 현재 기대하는 값 (Expected Value)
    • 변경 하려는 값 (New Value) img_1.png
  • CAS 연산 시작

    • 변수의 현재 값(메인 메모리)과 기대하는 값(CPU 캐시)이 일치하는지 확인합니다.
      • 동일하다는 것은 다른 스레드가 값을 바꾼 적이 없다는 뜻
  • 일치하는 경우 (CAS 성공)

    • 변수의 값을 변경하려는 새 값으로 업데이트합니다.
    • CAS 연산 성공 리턴 (true)
  • 일치하지 않는 경우 (CAS 실패)

    • 아무 작업도 수행하지 않습니다.
    • CAS 연산 실패 리턴 (false)
  • CAS 결과

    • 변수의 값이 변경되거나 변경되지 않습니다.
    • CAS 연산의 결과에 따라 true 또는 false가 반환됩니다.