경쟁 조건
- 한 대상에 대해 여러 스레드가 동시에 접근하면서 발생하는 동기화 이슈
- 논리적 오류에 해당하지만 컴파일 오류로 확인하기 어려울 수 있음(개발자 역량으로 대응)
- C/C++같은 네이티브 코드도 예외 아니며 Java 경우 C/C++의 포인터를 이용한 참조 경우와 유사
volatile은 메모리 가시성에 관한 문제라 이렇게 멀티스레드의 동시 접근에의한 동시성 문제를 해결못해준다.
✅ 해결함 (가시성)
private volatile boolean flag = false;
// 스레드1
flag = true;
// 스레드2 - 즉시 변경사항 확인 가능
if (flag) { ... }❌ 해결 안 함 (동시성)
private volatile int count = 0;
// 여러 스레드에서 동시 실행시 race condition 발생
count++; // 안전하지 않음올바른 해결책
// AtomicInteger 사용
private AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet(); // 원자적 연산
// 또는 synchronized 사용
private int count = 0;
public synchronized void increment() {
count++;
}