inflearn logo
강의

Course

Instructor

Solid Foundation! Starting Java Fiercely Part 3 (First Half): Multithreading and Synchronization

JVM Object Memory Layout and Lock flag

메소드에 대한 lockFlag 작동 방식 문의드립니다.

Resolved

43

작성자 없음

0 asked

0

안녕하세요, 강사님. 강의를 통해 많은 도움을 얻고 있는 수강생입니다.

강의 내용 중 스레드 경합과 관련하여, 제가 확인한 공식 문서의 내용과 차이가 있는 부분이 있어 명확히 이해하고자 질문을 남깁니다.


강의 내에서는 "하나의 인스턴스에 존재하는 메소드를 여러개의 스레드가 호출하는 경우 해당 매소드 호출에 따른 경합이 발생할수 있다" 라고 말씀하셨는데 공식문서 상에는 "synchronized 예약어 존재하는 경우에만 락이 발생 한다" 설명하고 있어 아래의 문의드립니다.

  1. 혹시 강의 상의 경합이 synchronized 예약어가 존재하는 경우를 한정해서 말씀하신걸까요?

  2. 만약 일반적인 경우라면 강의상에서 언급하신 스레드별 로컬변수 처리되어 경합처리가 발생하지 않고, 인스턴스의 지역변수인 경우는 락에 대한 처리가 되지 않을것 같은데 혹시 다른 상황을 가정하신 걸까요?

감사합니다.


참고 문헌 : 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 락이 생성됨

java jvm lock-free generic multithread

Answer 2

0

nullnull8537

Synchronized와 무관한 일반론으로 보시면 되겠습니다. 인스턴스 메서드를 여러 스레드가 호출할 때 경합이 발생할 수 있다는 건, "공유 상태(인스턴스 필드 등)에 동시 접근 시 race condition이 생길 수 있다"는 일반적인 사실을 말한 것입니다.


인스턴스 메서드를 여러 스레드가 호출할 때 경합이 발생할 수 있다는 건, "공유 상태(인스턴스 필드 등)에 동시 접근 시 race condition이 생길 수 있다"는 일반적인 사실을 말한 것입니다. AI 답변과 더불어 참고하시기 바랍니다. 😄

0

communityai8509

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

redbean님, 질문 주신 내용 잘 받았습니다. 강의 내용과 공식 문서의 차이점에 대해서 정확한 이해를 원하시는군요. 멀티스레드 환경에서의 synchronized 키워드와 lock의 사용에 대해 설명 드리겠습니다.

경합의 발생

  1. synchronized 예약어와 경합:

    • 공식적으로 Java에서는 synchronized 예약어가 지정되어 있는 블록이나 메서드에서만 lock이 발생합니다. 이는 스레드 간의 동기화를 위한 메커니즘을 제공하여, 동일한 객체에 여러 스레드가 접근할 때 상호배제를 보장합니다.
    • 즉, 강의에서 언급한 경합은 synchronized가 적용된 경우로 이해할 수 있습니다. synchronized가 없을 경우 일반적으로 경합은 발생하지 않겠지만, 동시에 같은 메소드를 호출하는 스레드들이 있을 때 정확히 원하는 시퀀스를 보장하지 않을 수 있습니다.
  2. 일반적인 메서드 호출의 경우:

    • synchronized가 없는 메서드의 경우 자바의 메서드 로컬 변수를 각 스레드가 자신의 스택에 저장하여 사용하기 때문에 경합이 발생하지 않습니다.
    • 인스턴스 변수(필드)에 접근하는 경우는 동기화가 없으면 경합이 발생할 수 있습니다.

이에 대해 추가적인 자료로는 다음과 같은 게시물을 참고해보시면 도움이 될 것입니다:
- 멀티스레드에서의 lock과 syncronized 관계
- JAVA 문서에서의 synchronized 동작 원리

redbean님의 궁금증에 대한 답변이 되었길 바랍니다.

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

중급 1편 학습 방향에 대해 조언 부탁드립니다

0

9

1

To-Do App

0

8

0

강의노트 접속 불가

0

7

1

Kafka Cluster 구성도 질문

0

6

1

26년 1회차 기출 강의

0

31

2

기출문제

0

49

1

정보처리기사 실기 zip

0

40

2

답을언제쯤받아볼수있나요

0

47

2

데이터베이스 노션

0

36

2

형 책 어떻게 받아?

1

52

1

PPT 자료 공유 받을 수 있을까요?

0

29

1

@JsonIgnore 이후 Internal Server Error가 발생하지 않습니다.

0

29

2

수업노선자료파일 다운

0

34

2

5~9까지 램덤숫자출력

0

27

1

프로젝트가 없어요..

0

55

2

C언어에서

0

50

1

포인터 질문

0

53

2

cpu 코어와 쓰레드 개수

0

244

2

JVM 메모리와 CPU 1,2차 캐시

0

74

2

36강 SpinLock 부분 질문

0

87

1

44강, 45강을 듣고 궁금한 점이 있어 질문드립니다.

0

85

1

커널객체와 jvm 객체 차이 질문.

0

99

1

JVM 스레드 TLS 질문

0

113

1

몇가지 질문드립니다

0

147

2