해결된 질문
작성
·
60
·
수정됨
0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
여기에 질문 내용을 남겨주세요.
마지막 notifyall에서 만약에 c1 다음에 p1이 락을 획득하면 나머지 c2, c3, c4, c5는 대기집합에 들어가나요 아니면 깨어있는 상태로 계속있나요?
답변 2
0
안녕하세요. 썩은도토리님
notifyAll()로 깨어난 c2, c3, c4, c5는 락을 획득하려고 하겠지요?
하지만 p1이 락을 가지고 있기 대문에 다시 대기집합에 들어가겠지요?
감사합니다.
0
안녕하세요, 인프런 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
는 락을 획득하기 위해 실행 가능 상태에서 대기하게 됩니다.