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

so1245p님의 프로필 이미지
so1245p

작성한 질문수

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

[section7-1강] 출금 예제

작성

·

37

0

안녕하세요, 강의 재밌게 수장중인 수강생입니다.

 

직전 강의 내용대로라면 공유자원인 balance 도 캐싱되어 항상 1000원이 조회되는 가시성 문제가 발생해야 할것 같은데 출금 예제에서는 발생하지 않는 이유가 궁금합니다. log() 때문에 그럴 수도 있을것 같아서 로그 제거 하고 출력해도 가시성 문제는 발생하지 않는것 같습니다. 제가 뭔가 잘못 이해한 부분이 있는것 같은데, 놓친 부분이 어디인지 잘 모르겠습니다 ㅜㅜ

답변 2

0

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

안녕하세요. so1245p님

이번 강의 마지막에 설명드린 것 처럼 balance 값은 메모리 가시성 문제가 발생할 수 있습니다!

다만 발생 가능성이 매우 낮기 때문에 눈으로 확인하는 것은 쉽지 않습니다.

추가로 log(), sleep()과 같은 코드가 실행될 때, 컨텍스트 스위칭이 발생하면서 메모리 가시성 문제가 해결되는 것 처럼 보일 수는 있습니다.

감사합니다.

 

 

0

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

동시성 이슈와 자바의 메모리 모델 때문에 발생할 수 있는 가시성 문제에 대해 이해하는 것은 굉장히 중요한 주제인데요. 관련해서 다음 URL을 참고하시면 도움이 될 것입니다.

  1. 자바의 가시성 문제와 volatile

    • 이 게시물은 자바에서의 가시성 문제와 volatile 키워드의 역할에 대해 설명하고 있습니다. volatile은 변수가 각 스레드의 캐시가 아닌 공유 메모리에서 직접 읽고 수정되도록 강제하는 역할을 합니다. log() 메서드가 출력 시점을 강제하기 때문에 가시성 문제가 덜 발생할 수 있습니다.
  2. 멀티스레드 환경에서 동시성 문제 해결하기

    • 동시성이슈는 어떻게 발생하고, 이를 통해 가시성 문제는 어떻게 해결할 수 있는지에 대해 다룹니다. synchronized 키워드나 volatile을 사용하는 이유를 배울 수 있습니다. 특정 공유 자원의 일관성을 유지하기 위해서는 명시적인 동기화가 필요하다는 점을 이해할 수 있을 것입니다.

이 두 가지 질문을 참고하시면, 가시성 문제를 이해하고, 왜 문제가 발생하지 않았는지에 대한 힌트를 얻으실 수 있을 것입니다. 로그가 timedelta에 따라 다르게 작용할 수 있지만, 기본적으로는 자바의 메모리 모델과의 상호작용에서 오는 문제를 이해할 필요가 있습니다.

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

so1245p님의 프로필 이미지
so1245p

작성한 질문수

질문하기