count 값 1107116232 질문
[질문 템플릿]
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 키워드와 메모리 동기화에 대한 후속 예제를 확인하실 수 있습니다:
자바에서의 Volatile 키워드와 그 중요성: 이 게시물은 자바에서 volatile 키워드의 역할과 중요성에 대해 설명하고 있습니다.
Multithreading과 메모리 모델: 멀티스레딩 환경에서의 메모리 모델과 변수 동기화에 대해 다루고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
0
답변 너무 감사합니다. 해결되지 않은 궁금점이 하나 있습니다.
MyTask flag값을 false로 바꾸고 count값을 출력할때, flag값이 0으로 떨어지지않고 1107116232라는 값으로 출력되어 의문입니다. MyTask에서 count값을 출력할때 메인메모리에 접근해서 값을 갖고오는건지, 다른 Thread의 캐시메모리에 접근해서 갖고오는건지 궁금했습니다
모니터와 synchronized, ReentrantLock, 원자적연산 CAS관련해서 추가적으로 더 깊게 공부했는데 제가 이해한 것이 맞나요??
0
85
1
Future cancel기능을 사용했지만 interrupt가 발생하지 않을 때 어떻게 처리해야하나요?
0
73
2
2.스레드 생성과 실행 - 17P 그림 문의
0
74
2
자바 동시성 현업에서 사용예시가 궁금합니다
0
136
1
ReentrantLock 동작 원리에 대한 질문입니다.
0
83
1
synchronized 대신 join 을 사용하여 순서를 보장할 경우 해법이 아닌가요?
0
94
2
메모리 가시성 문제 질문
0
72
1
Future4-이유 질문
0
64
1
오타 제보
0
76
2
runnable 질문
0
95
2
자바가 아닌 다른 언어에서도
0
111
1
메모리 가시성 문제가 발생하는 이유
0
125
1
데몬스레드가 어떨 때 사용이 되는지 궁금합니다.
0
78
1
Future.cancel() 취소를 사용하는 예가 궁금합니다.
0
84
1
synchronized 와 인스턴스의 lock
0
91
2
synchronized 키워드만으로 메모리 가시성이 해결되는 이유가 궁급합니다.
0
63
1
[스레드 풀과 Executor 프레임워크1][문제와 풀이] `log("일부 작업이 실패했습니다.");` 실행되는 경우가 있을까요?
0
59
1
원자적 연산이 멀티스레드 상황에서 안전한 이유를 제대로 이해했는지 확인 부탁드립니다
0
67
2
자바 고급 1,2,3편 같이 진행해도 문제없나요
0
77
2
CPU 캐시 때문에도 잔액이 200원이 될 수 있나요?
0
105
2
synchronized 메서드와 join 관련 질문이 있습니다.
0
69
2
섹션 14. 115번 강의 내용 질문
0
83
2
교안에 있는 7페이지 데이터 영역
0
51
1
Executor 스레드 풀 관리 질문
0
108
2





