패스잇
CS 기초 · 중급

특정 언어(예: Java, C#)에서 `volatile` 키워드가 멀티스레딩 환경에서 어떤 역할을 하는지 설명해주세요. `volatile`이 보장하는 것과 보장하지 못하는 것을 구분하여 설명하고, `synchronized` 또는 `Atomic` 클래스와의 차이점을 언급해주세요.

힌트 · `volatile`은 변수의 변경 사항이 모든 스레드에 즉시 가시화되도록 보장하지만, 원자성을 보장하지는 않습니다. `synchronized`는 가시성과 원자성을 모두 보장하며, `Atomic` 클래스는 특정 연산에 대한 원자성을 보장합니다.

가시성원자성메모리 배리어캐시 일관성happens-before

모범답안

"네, volatile 키워드는 멀티스레딩 환경에서 변수의 가시성을 확보하는 데 중요한 역할을 합니다. 즉, volatile 변수의 값이 변경되면 즉시 메인 메모리에 반영되고, 다른 스레드들이 해당 변수를 읽을 때 항상 최신 값을 읽도록 보장합니다. 이는 각 스레드의 캐시에 저장된 값이 오래되어 발생하는 데이터 불일치 문제를 해결하는 데 도움을 줍니다.

하지만 volatile은 원자성을 보장하지 않습니다. 예를 들어, volatile 변수에 대한 i++ 연산은 읽기, 증가, 쓰기 세 단계로 이루어지는데, 이 과정이 원자적으로 수행되지 않아 여러 스레드가 동시에 접근하면 데이터 경쟁이 발생할 수 있습니다.

synchronized 키워드는 가시성과 원자성을 모두 보장합니다. 특정 코드 블록을 synchronized로 감싸면 해당 블록은 한 번에 하나의 스레드만 실행할 수 있어 데이터 경쟁을 막고, 변경된 값이 즉시 모든 스레드에 보이도록 합니다.

AtomicInteger와 같은 Atomic 클래스는 특정 연산(예: 증가, 감소)에 대한 원자성을 보장합니다. CAS (Compare-and-Swap) 연산을 사용하여 동기화 문제를 해결하며, volatile 변수보다 더 복잡한 연산에 안전하게 사용할 수 있습니다."

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

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

함께 보는 동시성 / 멀티스레딩 면접 질문

← 동시성 / 멀티스레딩 면접 질문 전체 보기