CAS 루프

CAS는 값과 시간의 틈을 계속 재검사한다

락을 잡지 않는 대신 읽은 값이 그대로인지 확인하고, 틀리면 계산을 버린 뒤 새 값으로 다시 시도한다.

read old

현재 값을 읽음

스레드는 공유 변수의 old 값을 복사하고 그 값을 기준으로 계산한다.

compute new

새 값을 준비

아직 공유 메모리는 바꾸지 않고 지역 변수에서 결과를 만든다.

compare

기대값을 비교

메모리가 old 그대로이면 new로 교체하고, 아니면 실패한다.

retry

실패하면 반복

다른 스레드가 먼저 바꿨다는 뜻이므로 최신 값부터 다시 읽는다.

정상 충돌

A를 읽었는데 메모리가 C로 바뀌어 있으면 CAS는 실패하고 재시도한다.

ABA 함정

A가 B를 거쳐 다시 A가 되면 값 비교만으로는 중간 변경을 놓칠 수 있다.

방어책

포인터나 노드 참조처럼 변경 이력이 중요한 값은 값과 버전 번호를 함께 비교해서 A:7이 A:9로 돌아온 상황까지 구분한다.