Java ‐ CAS & 동기화와 원자적 연산 - thought-corner/Backend-PlayGround GitHub Wiki
원자적 연산의 개념
- 원자적 연산이란 해당 연산이 더 이상 나눌 수 없는 단위로 수행된다는 것을 의미한다.
- 즉, 원자적 연산은 중단되지 않고, 다른 연산과 간섭없이 완전히 실행되거나 전혀 실행되지 않는 성질을 가진다.
- 쉽게 이야기해서 멀티쓰레드 상황에서 다른 쓰레드의 간섭없이 안전하게 처리되는 연산이라는 뜻이다.
volatile
volatile 키워드는 여러 CPU 사이에 발생하는 캐시 메모리와 메인 메모리가 동기화되지 않는 문제를 해결할 뿐이다.
volatile 키워드를 사용하면 CPU의 캐시 메모리를 무시하고 메인 메모리를 직접 사용하도록 한다. 하지만 지금 이 문제는 캐시 메모리가 영향을 줄 수 있지만 캐시 메모리를 사용하지 않고 메인 메모리를 직접 사용한다고 하더라도 여전히 발생한다.
volatile 키워드는 연산 자체를 원자적으로 묶어주는 기능이 아니다.
synchronized
synchronized 키워드를 사용해 안전한 임계 영역을 만들고 연산을 수행하면 정확한 결과를 얻을 순 있으나 성능 저하가 발생할 가능성이 높다.
AtomicInteger
- 자바는 멀티쓰레드 상황에서 안전하게 증가 연산을 수행할 수 있는
AtomicInteger 클래스를 제공한다. 이름 그대로 원자적인 Integer라는 뜻이다.
- 다양한
AtomicXXX 클래스가 존재한다.