강의 메모 - CAS (Compare and Swap) 이해와 활용 - 1,2 #
개요 #
- CAS(Compare and Swap, 비교 후 치환) 는 멀티 스레드 환경에서 스레드 간의 경쟁 조건을 방지하고 락을 사용하지 않고도 공유 변수의 값을 원자적으로 변경하는 방법을 제공한다
- CAS 는 CPU 캐시와 메인메모리의 두 값을 비교하고 그 값이 동일할 경우 새로운 값으로 교체하는 동기화 연산으로 여러 스레드가 공유하는 메모리 영역을 보호하는 데 사용된다
- CAS 는 락 기반의 동기화보다 경량화되어 있으며 락을 사용하지 않기 때문에 대기하지 않는 넌블록킹 실행이 가능하고 경쟁 조건과 데드락을 피할 수 있다
- CAS는 조건에 따라 실패하고 다시 시도해야 할 수 있기 때문에 동시적으로 접근하는 요청의 수가 많은 경쟁 조건일 경우 효율성이 저하될 수 있다
- CAS는 주로 하드웨어 수준(CPU) 에서 지원되는 연산이며 Java에서는 java.util.concurrent.atomic 패키지에 있는 원자적 연산을 통해 CAS를 지원하고 있다
- 우리가 별도로 동기화 해 줄 필요가 없다.
- T1이 main 메모리에서 100을 가져갔을때, T2가 중간에 동일한 100을 가지고 300이라는 새로운 값으로 메모리에 저장을 한 상황이 오면,
- 다시 T1이 로직을 수행하려고 할때, 200이랑 300이 같지 않으므로 취소된다.
CAS 동작 방식 #
-
세 가지 핵심 매개변수
- 변수의 현재 메인 메모리 값 (Value; this.counter)
- 변수의 현재 기대하는 값 (Expected Value)
- 변경 하려는 값 (New Value)
-
CAS 연산 시작
- 변수의 현재 값(메인 메모리)과 기대하는 값(CPU 캐시)이 일치하는지 확인합니다.
- 동일하다는 것은 다른 스레드가 값을 바꾼 적이 없다는 뜻
- 변수의 현재 값(메인 메모리)과 기대하는 값(CPU 캐시)이 일치하는지 확인합니다.
-
일치하는 경우 (CAS 성공)
- 변수의 값을 변경하려는 새 값으로 업데이트합니다.
- CAS 연산 성공 리턴 (true)
-
일치하지 않는 경우 (CAS 실패)
- 아무 작업도 수행하지 않습니다.
- CAS 연산 실패 리턴 (false)
-
CAS 결과
- 변수의 값이 변경되거나 변경되지 않습니다.
- CAS 연산의 결과에 따라 true 또는 false가 반환됩니다.