인프런 커뮤니티 질문&답변
작성자 없음
작성자 정보가 삭제된 글입니다.
메소드에 대한 lockFlag 작동 방식 문의드립니다.
작성
·
7
0
안녕하세요, 강사님. 강의를 통해 많은 도움을 얻고 있는 수강생입니다.
강의 내용 중 스레드 경합과 관련하여, 제가 확인한 공식 문서의 내용과 차이가 있는 부분이 있어 명확히 이해하고자 질문을 남깁니다.
강의 내에서는 "하나의 인스턴스에 존재하는 메소드를 여러개의 스레드가 호출하는 경우 해당 매소드 호출에 따른 경합이 발생할수 있다" 라고 말씀하셨는데 공식문서 상에는 "synchronized 예약어 존재하는 경우에만 락이 발생 한다" 설명하고 있어 아래의 문의드립니다.
혹시 강의 상의 경합이 synchronized 예약어가 존재하는 경우를 한정해서 말씀하신걸까요?
만약 일반적인 경우라면 강의상에서 언급하신 스레드별 로컬변수 처리되어 경합처리가 발생하지 않고, 인스턴스의 지역변수인 경우는 락에 대한 처리가 되지 않을것 같은데 혹시 다른 상황을 가정하신 걸까요?
감사합니다.
참고 문헌 : https://docs.oracle.com/javase/specs/jls/se21/html/jls-14.html#jls-14.19 - synchronized가 있는 경우에만 monitorenter 코드가 생성됨
https://docs.oracle.com/javase/specs/jvms/se21/html/jvms-3.html#jvms-3.14
https://docs.oracle.com/javase/specs/jvms/se21/html/jvms-6.html#jvms-6.5.monitorenter - monitorenter 코드가 존재하면 object 락이 생성됨
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
redbean님, 질문 주신 내용 잘 받았습니다. 강의 내용과 공식 문서의 차이점에 대해서 정확한 이해를 원하시는군요. 멀티스레드 환경에서의 synchronized 키워드와 lock의 사용에 대해 설명 드리겠습니다.
경합의 발생
synchronized 예약어와 경합:
- 공식적으로 Java에서는
synchronized예약어가 지정되어 있는 블록이나 메서드에서만 lock이 발생합니다. 이는 스레드 간의 동기화를 위한 메커니즘을 제공하여, 동일한 객체에 여러 스레드가 접근할 때 상호배제를 보장합니다.
- 즉, 강의에서 언급한 경합은
synchronized가 적용된 경우로 이해할 수 있습니다.synchronized가 없을 경우 일반적으로 경합은 발생하지 않겠지만, 동시에 같은 메소드를 호출하는 스레드들이 있을 때 정확히 원하는 시퀀스를 보장하지 않을 수 있습니다.
- 공식적으로 Java에서는
일반적인 메서드 호출의 경우:
synchronized가 없는 메서드의 경우 자바의 메서드 로컬 변수를 각 스레드가 자신의 스택에 저장하여 사용하기 때문에 경합이 발생하지 않습니다.
- 인스턴스 변수(필드)에 접근하는 경우는 동기화가 없으면 경합이 발생할 수 있습니다.
이에 대해 추가적인 자료로는 다음과 같은 게시물을 참고해보시면 도움이 될 것입니다:
- 멀티스레드에서의 lock과 syncronized 관계
- JAVA 문서에서의 synchronized 동작 원리
redbean님의 궁금증에 대한 답변이 되었길 바랍니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





