인프런 커뮤니티 질문&답변

guswhd903님의 프로필 이미지
guswhd903

작성한 질문수

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

volatile, 메모리 가시성4

count 값 1107116232 질문

작성

·

25

·

수정됨

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]

강의에서 volatile을 적용하지 않은 예제에서

MyTask flag값을 false로 바꾸고 count값을 출력했는데 이때

MyTask Thread의 캐시메모리에있는 값을 메인메모리로 업데이트하고, Main Thread는 메인메모리에있는 count값을 캐시메모리에 동기화해서 갖고온걸까요?

 

출력할 때 컨텍스트 스위칭이 일어났다고 가정하면, 1_100_000_000이 출력될거라 생각했는데 궁금해서 질문드립니다!

답변 2

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. guswhd903님

1107116232 값은 메인스레드에서 출력한 값 입니다.

메인스레드에서 이 값을 출력하기 전에 task.count의 값을 메모리에서 먼저 읽고, 이후에 읽은 값을 출력하기 때문에 컨텍스트 스위칭이 영향을 주지는 않습니다.

추가로 이 값을 캐시메모리에서 읽은 것인지 아니면 메인 메모리에 접근해서 가지고 온 것 인지는 확인하기 어렵습니다. 확실한 것은 캐시메모리에서 읽을 수도 있고, 메인 메모리에서 읽을 수도 있기 때문에 원하는 데이터를 구하지 못할 가능성이 있다는 점입니다. 그래서 이런 경우에는 volatile 키워드를 사용하는 것이 필요하다는 점을 이해하면 충분합니다.

감사합니다.

1

안녕하세요, 인프런 AI 인턴입니다. guswhd903님.

volatile 키워드는 멀티스레드 환경에서 변수의 값을 정확하게 읽고 쓰기 위해 사용됩니다. 변수가 volatile로 선언되면, 각 스레드는 해당 변수의 값을 항상 메인 메모리에서 읽고, 메인 메모리에 직접 기록하게 됩니다. 따라서 스레드들은 변수의 최신 값을 보장받게 됩니다.

guswhd903님의 질문에 따르면, MyTask의 flag 값을 false로 바꾸고 count 값을 출력하는 상황에서 스레드의 캐시 메모리와 메인 메모리 간의 데이터 동기화 문제를 고려하고 계신 것 같습니다. 일반적으로 volatile을 사용하지 않을 경우, 스레드들은 자신의 캐시 메모리에 저장된 값을 사용하기 때문에 메인 메모리를 참조하지 않을 수 있습니다. 따라서 실제로 count의 값이 완벽하게 동기화되지 않고 예상한 값과 다른 값이 출력될 수 있습니다.

context switching이 발생하면, 스레드의 실행 상태가 전환되면서 메모리에서 가장 최신의 값을 읽고 동기화할 여지가 있습니다. 하지만, 이 역시 스레드 스케줄링과 메모리 동기화 타이밍에 따라 달라질 수 있습니다.

관련 링크에서 멀티스레드 환경에서의 volatile 키워드와 메모리 동기화에 대한 후속 예제를 확인하실 수 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

guswhd903님의 프로필 이미지
guswhd903
질문자

답변 너무 감사합니다. 해결되지 않은 궁금점이 하나 있습니다.

MyTask flag값을 false로 바꾸고 count값을 출력할때, flag값이 0으로 떨어지지않고 1107116232라는 값으로 출력되어 의문입니다. MyTask에서 count값을 출력할때 메인메모리에 접근해서 값을 갖고오는건지, 다른 Thread의 캐시메모리에 접근해서 갖고오는건지 궁금했습니다

guswhd903님의 프로필 이미지
guswhd903

작성한 질문수

질문하기