락을 걸지 않고도 값을 안전하게 업데이트할 수 있는 낙관적 동기화가 가능합니다
충돌이 자주 발생하지 않을 것이라 가정하며, 충돌이 적은 환경에서 높은 성능을 발휘합니다
또한 CAS는 락을 사용하지 않기 때문에 락 획득을 위해 대기하는 시간이 없습니다
스레드가 블로킹되지 않고, 병렬 처리가 더 효율적일 수 있는 장점이 있습니다
충돌이 빈번한 경우 여러 스레드가 동시에 동일한 변수에 접근해서 업데이트를 시도할 때
충돌이 발생할 수 있습니다
충돌이 발생하면 CAS는 루프를 돌며 재시도해야하고 CPU 자원을 계속 소모할 수 있습니다
따라서 반복적인 재시도로 인해 오버헤드가 발생할 수 있습니다
또한 CAS는 충돌빈도가 높을 수록 스핀락과 성능저하가 발생할 수 있습니다
락을 사용하면 하나의 스레드만 리소스에 접근할 수 있어서 충돌이 발생하지 않으며
여러 스레드가 경쟁할 경우에도 안정적으로 동작합니다
또한 복잡한 상황에서도 락은 일관성 있는 동작을 보장하며, 락을 대기하는 스레드는 CPU를 거의 사용하지 않습니다
스레드가 락을 획득하기 위해 대기해야해서 대기 시간이 길어질 수 있습니다
또한 락을 사용하면 락 획득을 대기하는 시점과 락을 획득하는 시점에 스레드 상태가 변경됩니다
이때 컨텍스트 스위칭이 발생할 수 있고, 오버헤드가 증가할 수 있습니다
일반적으로 동기화 락을 사용하고, 연산이 금방 끝나는 것에 대해서는 CAS를 사용하면 됩니다!
특히 스레드를 RUNNABLE 상태로 유지해서 락 획득을 반복체크하는 것이
더 효율적일 때 사용하는 것이 좋습니다!