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
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.
-
원자적 연산 - 소개
1. 원자적 연산
synchronized또는Lock으로 임계 영역을 명확하게 보호해서 동시성 문제를 막아야 한다.i = 1;처럼 단일 쓰기(write) 로 끝나는 형태이므로, 해당 쓰기 자체는 원자적으로 수행되는 연산으로 이해할 수 있다.i = i + 1;은 원자적 연산이 아니다.도 내부적으로는i = i + 1`과 같은 읽기(read) → 계산(add) → 쓰기(write) 단계로 분해되므로 원자적 연산이 아니다.원자적 연산 - 시작
1. 코드
increment()메서드를 통하여 값을 하나 증가시킨다.value++연산은 여러 스레드에서 공유될 수 있으며,++연산과 같이 원자적이지 않은 연산을 사용하면 문제가 발생할 수 있다.THREAD_COUNT만큼 스레드를 생성하고incrementInteger.increment()을 호출한다.sleep(10)은 모든 스레드를 비슷한 타이밍에 실행시키는 효과가 있어 경쟁 상태를 더 잘 재현하게 만든다.value++가 원자적이지 않아 두 스레드가 같은 값을 읽고 각각 +1을 계산한 뒤, 마지막에 쓴 값이 이전 쓰기를 덮어써서 증가 1회가 사라지는 상황이 반복되기 때문이다.원자적 연산 - volatile, synchronized
1. volatile
2. synchronized
원자적 연산 - AtomicInteger
1. 코드
AtomicInteger객체를 선언하고 0으로 초기화한다.incrementAndGet()은 내부적으로 증가 연산을 원자적으로 처리하여, 여러 스레드가 동시에 호출해도 증가 누락이 발생하지 않는다.get()은 현재 값을 안전하게 읽을 수 있도록 제공되는 조회 메서드이다.원자적 연산 - 성능 테스트
1. 코드
1) BasicInteger
value++는 단일 스레드에서는 직관적으로 기대한 대로 동작하지만, 멀티스레드에서는 원자성이 보장되지 않아 증가 누락이 발생할 수 있다.2) VolatileInteger
volatile를 사용하여 CPU 캐시를 사용하지 않고 메인 메모리를 사용한다.BasicInteger보다 느리고, 멀티스레드 상황에서도 안전하지 않다.volatile은 가시성과 순서 보장에 관여하지만,value++같은 복합 연산을 원자적으로 만들지는 못하므로 증가 누락 문제는 그대로 발생할 수 있다.3) SyncInteger
synchronized를 사용한 임계 영역이 있기 때문에 멀티 스레드 상황에서도 안전하게 사용할 수 있다.synchronized는 한 번에 하나의 스레드만 임계 영역에 들어오게 만들어 원자성을 확보하므로, 멀티스레드에서도 결과가 안정적이다.4) MyAtomicInteger
AtomicInteger를사용하며, 멀티스레드 상황에서도 안전하게 사용할 수 있다.synchronized,Lock(ReentrantLock)를 사용할 때보다 더 빠르다.AtomicInteger.incrementAndGet()은 CAS 기반의 원자 연산을 활용해 증가를 안전하게 처리하는 방식으로 이해할 수 있다.Beta Was this translation helpful? Give feedback.
All reactions