Krong Dev.
아카이브 목록

CAS(Compare and Swap)와 ABA 문제


CAS(Compare and Swap)?

  • 멀티스레드 환경에서 락(lock)없이 동시성 문제를 해결하기 위한 원자적 알고리즘이다.
  • 메모리의 현재 값과 내가 예상한 값을 비교한 뒤 일치하는 경우에만 새로운 값으로 교체하는 연산이다.
  • 특징 : 락을 걸지 않기 때문에 데드락이 발생하지 않고 성능이 우수하지만, 값이 다르면 교체에 실패하고 재시도한다.
  • 이 방법으로 동시성 문제를 해결할 수도 있지만, ABA 문제가 발생할 수도 있다.

ABA 문제?

  • 예를 들어, 스레드 1이 메모리의 값이 A라고 했을 때 다른 스레드 2가 와서 값을 B로 교체했다가 다시 A로 되돌려 놓은 상황이다.
  • 이때 스레드 1이 CAS 연산을 수행하면서 메모리 값이 여전히 A이므로 ‘값이 변경되지 않았다’고 판단하여 성공처리한다. 하지만 그 사이 내부 상태나 객체가 완전히 바뀌었을 수 있어서 정합성이 깨지고, 상태 추적이 어려워진다.

해결 방법?

    1. Atomic Stamped Reference 방식 : Value-Version으로 묶어서 값을 저장할 때 버저닝을 한다. (스탬프를 찍듯이)
    1. 불변 객체 참조 : 매번 새로운 객체를 생성하여 참조 자체를 변경한다. 같은 값이라도 다른 객체 인스턴스이기 때문에 참조 비교로 변경을 감지하는 방식으로 해결할 수 있다.
  • #TIL
  • #동시성