패스잇
백엔드 개발 · 심화

Java의 volatile 키워드의 역할과 사용 시 주의사항에 대해 설명해주세요.

힌트 · 가시성(visibility) 보장과 원자성(atomicity)의 차이를 생각해보세요.

가시성메모리 장벽원자성캐시 일관성happens-before

모범답안

Java의 volatile 키워드는 주로 멀티스레드 환경에서 변수의 **가시성(visibility)**을 보장하는 데 사용됩니다. 즉, 한 스레드에서 변경된 volatile 변수의 값이 다른 모든 스레드에 즉시 보이도록 합니다. 이는 CPU 캐시와 메인 메모리 간의 일관성을 유지하기 위해 컴파일러와 JVM에게 특별한 지시를 내리는 것과 같습니다. volatile은 변수 읽기/쓰기 작업 시 **메모리 장벽(memory barrier)**을 생성하여, 이전 작업이 완료된 후에 다음 작업이 수행되도록 강제합니다.

하지만 volatile은 **원자성(atomicity)**을 보장하지 않습니다. 예를 들어, volatile int count 변수에 대해 count++ 연산을 수행할 때, 이는 읽기, 증가, 쓰기 세 단계로 나뉘므로 원자적이지 않습니다. 따라서 여러 스레드가 동시에 count++를 실행하면 예상치 못한 결과가 발생할 수 있습니다. volatile은 단일 변수에 대한 읽기/쓰기 작업의 가시성을 보장하지만, 복잡한 연산의 원자성을 보장하려면 synchronized 블록이나 java.util.concurrent 패키지의 원자적 변수 클래스를 사용해야 합니다. volatilehappens-before 관계를 통해 스레드 간의 순서를 보장하는 데에도 기여합니다.

읽었다면, 이제 직접 답해볼 차례예요

패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.

함께 보는 Java / Spring 면접 질문

← Java / Spring 면접 질문 전체 보기