You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
incrementAndGet() 메서드는 먼저 atomicInteger.get()으로 현재 값을 읽어오고, 그 값을 기준으로 compareAndSet(getValue, getValue + 1)을 호출해 현재 값이 예상값(getValue)과 같을 때만 새 값(getValue + 1)으로 갱신을 시도한다.
main 스레드 하나만 실행하는 구조이므로 경쟁이 발생하지 않으며, 그 결과 CAS 연산(compareAndSet)이 사실상 항상 성공한다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
CAS 연산1
1. 락 기반 방식의 문제
synchronized,Lock등을 사용하는 방식은 임계 영역에 진입하기 위해 락을 획득하고, 작업이 끝나면 락을 반납하는 흐름이 반복되는 구조이다.2. 예제
new AtomicInteger(0)코드는 내부 값을 0으로 초기화한다.자바는 compareAndSet()메서드를 통해 CAS 연산을 지원한다.compareAndSet(0, 1)이 첫 번째에는 성공하고, 두 번째에는 실패하는 상황을 보여준다.compareAndSet(0, 1)메서드는 “현재 값이 0이면 1로 바꿔라”는 의미로 동작한다.compareAndSet(0, 1)메서드는 원자적으로 실행되기 때문에 CAS 연산을 지원한다.3. 실행 순서
4. CPU 하드웨어 지원
1) 성공시
2) 실패시
CAS 연산2
1. CAS 구현
incrementAndGet()메서드는 먼저atomicInteger.get()으로 현재 값을 읽어오고, 그 값을 기준으로compareAndSet(getValue, getValue + 1)을 호출해 현재 값이 예상값(getValue)과 같을 때만 새 값(getValue + 1)으로 갱신을 시도한다.compareAndSet)이 사실상 항상 성공한다.CAS 연산3
1. 코드
AtomicInteger의 값을 서로 증가시킨다.Thread-0,Thread-1이 거의 동시에AtomicInteger의 값을 읽어getValue: 0을 출력한다.Thread-1이compareAndSet(0, 1)을 먼저 성공시키면서 실제 값이 1로 바뀐다.Thread-0은 여전히 “예상 값이 0일 것”이라고 가정하고compareAndSet(0, 1)을 호출하므로, 이미 값이 1로 바뀐 상태여서 CAS가 실패(false)한다.Thread-0은 루프를 한 번 더 돌며 최신 값 1을 다시 읽고compareAndSet(1, 2)를 수행해서 성공한다.resultValue = 2가 된다.2. 원리
AtomicInteger에서 제공하는incrementAndGet()메서드는 내부적으로 CAS 루프를 사용하며, 지금 작성한incrementAndGet()과 같은 형태로 동작한다고 이해할 수 있다.3. 비교
1) 락 방식
2) CAS 방식
compareAndSet()으로 값이 바뀌지 않았는지만 확인한다.Beta Was this translation helpful? Give feedback.
All reactions