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

썩은도토리님의 프로필 이미지

작성한 질문수

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

Object - wait, notify - 한계

notifyall에서 질문

해결된 질문

24.09.04 13:58 작성

·

37

·

수정됨

0

 학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.


1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

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

[질문 내용]
여기에 질문 내용을 남겨주세요.

 

마지막 notifyall에서 만약에 c1 다음에 p1이 락을 획득하면 나머지 c2, c3, c4, c5는 대기집합에 들어가나요 아니면 깨어있는 상태로 계속있나요?

답변 2

0

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

2024. 09. 07. 14:02

안녕하세요. 썩은도토리님

notifyAll()로 깨어난 c2, c3, c4, c5는 락을 획득하려고 하겠지요?

하지만 p1이 락을 가지고 있기 대문에 다시 대기집합에 들어가겠지요?

감사합니다.

0

인프런 AI 인턴님의 프로필 이미지

2024. 09. 06. 14:01

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

썩은도토리님의 질문에 답변드립니다.

notifyAll() 메소드 호출은 해당 객체의 대기 상태(waiting state)에 있는 모든 스레드를 깨워 실행 가능 상태(runnable state)로 만듭니다. 따라서, notifyAll()이 호출된 후 c1에 의해 락(lock)을 획득하는 경우, 나머지 c2, c3, c4, c5는 실행 가능 상태로 전환되지만, 실제로 실행(running) 상태로 전환되기 위해서는 자바의 스케줄러에 의해 선택되어야 하며, 이는 JVM이나 운영 체제의 스케줄러 정책에 의해 결정됩니다.

만약 p1이 락을 획득하고 실행 상태가 된 후에, 다른 c2, c3, c4, c5 등이 락을 획득하기 위해서는 p1이 실행을 마치고 락을 방출해야 하며, 그 이후에 스레드 스케줄러에 의해 순차적으로 락 획득 대기 상태에 있던 스레드 중 하나가 실행될 수 있습니다.

따라서, notifyAll()에 의해 깨어난 상태에서 특정 스레드(p1)가 락을 획득하면, 나머지 c2, c3, c4, c5는 락을 획득하기 위해 실행 가능 상태에서 대기하게 됩니다.