CAS는 연산 뿐만아니라 락을 구현하는데도 사용할 수 있습니다
synchronized, Loc(ReentrantLock)없이 CAS를 활용해서 락을 구현할 수 있습니다
public void lock(){
while(true){
if(!lock){
lock = true;
break;
}else{
System.out.println("락 획득 실패")
}
}
}
이 예제에서 락을 획득하면 lock을 true로 바꿔주고, while문을 탈출합니다
스레드가 락을 획득하지 못하면 스핀대기 즉, 바쁜 대기를 반복하게 됩니다
이 예제의 문제점은 lock 획득 여부를 체크할 때 동시에 여러 스레드가 접근하면 문제가 발생한다는 점입니다
또한 락의 값을 변경할 때도 문제가 발생합니다
이것은 락 사용여부를 확인하고 락의 값을 변경하는 지점에 대해 원자적이지 않기 때문에
발생하는 문제입니다
두 영역은 한번의 하나의 스레드만 실행해야 합니다
synchronized나 Lock을 사용해서 두 코드를 동기화하고 안전한 임계영역을 만들어야 합니다
또다른 해결 방법으로 두 코드를 하나로 묶어서 원자적으로 처리하는 것입니다
CAS 연산을 활용해서 원자적 연산을 처리할 수 있습니다
즉, 락의 사용 여부를 확인하고 그 값이 기대하는 값과 같다면 변경하면 됩니다