백엔드 면접준비/Java
2. Java 멀티쓰레드 환경(volatile, synchronized, atomic)
oss0202
2025. 2. 2. 17:42
멀티쓰레드 환경에서 자주 언급되는 가시성, 원자성, 동기화에 대해서 먼저 이해하고 넘어가야합니다.
개념 | 원자성(Atomicity) | 가시성(Visibility) | 동기화(Synchronization) |
목적 | 중간에 끊기지 않고 완전한 실행 보장 | 변수 값이 다른 쓰레드에서 즉시 보이게 보장 | 여러 쓰레드에서 동시 접근 제어 |
보장 | 연산이 중간에 끊어지지 않음 | 다른 쓰레드가 즉시 값을 반영 | 원자성, 가시성 보장 |
예시 | AtomicInteger.incrementAndGet() | volatile 변수 | synchronized 키워드 사용 |
성능 | 매우 효율적(CAS방식) | 성능 저하 없음 | 성능 저하, 잠금 획득 대기 가능 |
CAS(Compare And Swap)방식
- CPU나 메모리에 저장된 현재 값과 기존 값을 비교한 후, 만약 값이 일치하면 새로운 값을 메모리에 반영하는 방식입니다. 만약 값이 일치하지 않으면 다른 스레드가 이미 값을 변경했기 때문에, 교환은 일어나지 않고 다시 값을 읽어 비교하는 작업을 반복한다.
특성 | volatile | synchronized | atomic |
목적 | 변수의 값이 항상 최신 상태로 유지되도록 보장 | 메소드, 블록 단위로 동기화 하여, 한 번에 하나의 쓰레드만 접근이 가능하게 함 | 변수를 원자적으로 업데이트하고, 동기화 없이 멀티쓰레드에서 안전하게 연산가능 |
적용 대상 | 변수 단위 | 메소드나 코드 블록 | 특정 클래스 또는 메서드(ex. AtomicInteger) |
쓰레드 안정성 | 읽기/쓰기 시 다른 쓰레드와의 충돌 방지 | 동기화된 블록/메소드 내에서만 안전성 보장 | 내부적으로 동기화가 되어 있어, 락 없이 안전하게 연산 가능 |
성능 | 상대적으로 성능이 좋음 (간단한 변수 사용 시) |
동기화에 따른 성능 저하가 있음 | 성능이 높지만, 특정 연산만 지원(단일 연산에 최적화) |
주요 사용 사례 | 단순한 상태 변경, 플래그 설정 등 | 데이터 무결성 보장이 필요한 복잡한 작업 | 단일 변수를 원자적으로 처리해야 하는 경우(ex. 카운터) |
가시성 보장 | 모든 쓰레드에서 보장 | 단일 쓰레드만 접근 가능 | 각 연산이 원자적이므로 다른 쓰레드에 안전하게 값 전달 |
성능에 미치는 영향 | 매우 적음, 변수 값 읽기/쓰기에만 관련 | 동기화가 필요한 코드에 성능 저하가 발생 | 성능은 높지만 제한된 연산만 제공(ex. compareAndSet) |
volatile
- 목적: 변수의 가시성을 보장.
- 동작: volatile로 선언된 변수는 한 스레드가 그 값을 변경하면 다른 모든 스레드가 즉시 그 변경을 볼 수 있게 됩니다.
- 특징:
- 원자성(atomicity)이나 동기화(synchronization)는 보장하지 않습니다.
- 가시성만 보장하고, 복잡한 연산에서는 문제가 발생할 수 있습니다.
synchronized
- 목적: 원자성과 가시성을 보장.
- 동작: synchronized는 동기화를 통해 한 번에 하나의 스레드만 특정 코드 블록을 실행할 수 있게 보장합니다.
- 이로 인해 경쟁 상태(race condition)를 방지하고, 여러 스레드가 동시에 공유 자원에 접근할 때 데이터 일관성을 유지할 수 있습니다.
- 특징:
- 원자성과 가시성을 보장하지만, 성능 저하를 일으킬 수 있습니다.
- 코드 블록을 동기화하여, 한 번에 하나의 스레드만 접근할 수 있게 합니다.
atomic (원자적 연산)
- 목적: 멀티스레드 환경에서 원자성을 보장.
- 동작: Atomic 클래스(AtomicInteger, AtomicBoolean 등)는 원자적 연산을 통해 멀티스레드 환경에서 데이터의 일관성을 안전하게 유지합니다.
- AtomicInteger의 incrementAndGet()과 같은 메서드는 내부적으로 CAS(Compare-And-Swap) 기법을 사용하여 원자적으로 값을 증가시킵니다.
- 동기화보다 효율적이면서도 경쟁 상태를 방지합니다.
- 특징:
- 원자성을 보장하지만, 가시성은 보장하지 않습니다. (다만 CAS 방식으로 충돌을 자동 해결)