값을 하나 증가하는 연산은 원자적 연산이 아닙니다
viewValue++;
이렇게 조회수를 증가시키는 연산은 다음과 같습니다
viewValue = viewValue + 1
이 연산을 다시 나누면 다음 순서로 진행됩니다
1. 오른쪽에 있는 값을 읽습니다. 초기값이 0입니다
2. 초기값에 1을 더해서 1을 만듭니다
3. 더한 1을 왼쪽 변수에 대입합니다
이렇게 3가지 순서로 진행되기 때문에 중간에 다른 스레드가 개입해서 값을 변경할 수 있습니다
따라서 락을 걸어준 뒤 값을 증가해야합니다
락 없이 CAS 연산을 활용해서 조회수를 증가시키는 연산을 만들 수 있습니다
CAS의 연산은 마치 do-while을 활용해 구현하는 방법과 비슷하게 진행합니다
do{
value = atomic.get();
res = atomic.compareAndSet(value, value + 1);
}while(!res)
CAS 연산이 성공한다면 true를 반환하고 해당 do-while문을 빠져나오지만
실패하면 false를 반환하고 다시 시작합니다
이러한 CAS 연산을 사용하면 멀티 스레드 환경에서 같은 값을 사용하는 상황에서도
락을 걸지 않고 안전하게 값을 증가시킬 수 있습니다!