[CS/운영체제] 멀티스레드와 동시성 - 23부

황제연·2025년 7월 22일
0

CS학습

목록 보기
143/193
post-thumbnail

CAS 락 구현

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 연산을 활용해서 원자적 연산을 처리할 수 있습니다

즉, 락의 사용 여부를 확인하고 그 값이 기대하는 값과 같다면 변경하면 됩니다

참고

  • 김영한의 실전 자바 - 고급 1편
profile
Software Developer

0개의 댓글