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

황제연·2025년 7월 20일
0

CS학습

목록 보기
141/193
post-thumbnail

원자적 연산

값을 하나 증가하는 연산은 원자적 연산이 아닙니다
viewValue++; 이렇게 조회수를 증가시키는 연산은 다음과 같습니다

viewValue = viewValue + 1
이 연산을 다시 나누면 다음 순서로 진행됩니다
1. 오른쪽에 있는 값을 읽습니다. 초기값이 0입니다
2. 초기값에 1을 더해서 1을 만듭니다
3. 더한 1을 왼쪽 변수에 대입합니다
이렇게 3가지 순서로 진행되기 때문에 중간에 다른 스레드가 개입해서 값을 변경할 수 있습니다
따라서 락을 걸어준 뒤 값을 증가해야합니다

CAS 연산 활용

락 없이 CAS 연산을 활용해서 조회수를 증가시키는 연산을 만들 수 있습니다
CAS의 연산은 마치 do-while을 활용해 구현하는 방법과 비슷하게 진행합니다

do{
	value = atomic.get();
	res = atomic.compareAndSet(value, value + 1);
}while(!res)

CAS 연산이 성공한다면 true를 반환하고 해당 do-while문을 빠져나오지만
실패하면 false를 반환하고 다시 시작합니다

이러한 CAS 연산을 사용하면 멀티 스레드 환경에서 같은 값을 사용하는 상황에서도
락을 걸지 않고 안전하게 값을 증가시킬 수 있습니다!

참고

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

0개의 댓글