인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

윤성원님의 프로필 이미지

작성한 질문수

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

생산자 소비자 대기 공간 분리 - 예제5 분석

생산자 소비자 대기 공간 분리 예제5 분석 질문

작성

·

94

0

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


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

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

[질문 내용]

 

안녕하세요 영한님. 자바 고급편1 생산자 소비자 대기 공간 분리 - 예제5 분석 강의를 듣고 질문이 있어서 질문 올립니다.

 

소비자 먼저 시작 상황에서 질문이 있습니다.

소비자 1,2,3이 대기상태에 들어가면서 consumerCond.await() 에서 대기를 하고 있습니다. 그 다음으로 생산자1이 락을 받고 실행이 되지요? 생산자가 생산을 하고 consumerCond에 signal을 주게 됩니다. consumerCond.await()에서 대기하고 있던 소비자를 깨우게 되겠죠. 그럼 대기하고 있던 소비자 중 하나가(소비자1)이 와서 락을 받고 소비를 한 뒤에 producerCond에 signal을 보냅니다.

 

여기서 제가 궁금한게 나옵니다. 대기상태에 있던 소비자1이 깨어나서 소비를 하고 producerCond에 signal을 줄때 producerCond에 대기중인 생산자가 하나도 없지 않습니까? 그럼 이때 생산자가 락을 받는다는 100%의 보장이 어떻게 이루어지는지 그게 궁금합니다.

질문을 요약해서 적겠습니다.

 

  1. 대기상태에서 깨어난 소비자가 producerCond에 signal을 보낼때 producerCond에 대기하고 있던 생산자가 하나도 없는데 어떻게 생산자가 그 락을 받는다는 100%의 보장을 할 수 있는지?

  2. 대기상태에서 깨어난 소비자가 producerCond에 signal을 보낼때 producerCond에 대기하고 있던 생산자가 하나도 없는데 이럴때 소비자가 보낸 producerCond.signal(); 은 어떻게 처리가 되는지?

감사합니다.

답변 3

0

dev.rudevico님의 프로필 이미지

AI 인턴은 signal()을 받을 생산자가 없다면 신호가 대기열로 보내진다고 했는데, 이는 잘못된 답변같아서 적습니다.

혹시 다른 의견들 있으시면 답글 바랍니다.

  1. 소비자가 producerCond에 signal()을 보낼 때 producerCond에 생산자가 대기하고 있고, 락을 양보받는다.를 보장할 수 없습니다. producerCond.signal()을 호출하려면 producerCond.await()가 호출된 적이 있어야 한다 등의 조건을 사용하여 이를 보장하도록 할 수는 있겠으나, (저도 아직 뒷부분을 학습하지는 않아서) 현재까지 배운 내용으로는 보장할 수 없다고 생각하는 것이 맞습니다.

  2. producerCond에 대기하고 있던 생산자가 없을 때 소비자가 호출한 producerCond.signal()은 어떻게 되는가?


    -> signal()을 호출한 것이 무시되고 사라진다.
    consumerCond에 있는 소비자들은 계속 대기한다.
    이후에 언젠가 producer가 데이터를 생산하고, consumerCond.signal()을 호출해주기 전까지 소비자들의 대기는 계속된다.

 

2번의 경우 다음과 같은 경우를 생각해보면 유사한 메커니즘입니다.

public static int getNumber1() {
    return 1;
}

// 리턴(신호)을 받아줄 곳이 없으므로 리턴값인 1은 무시되고, 사라집니다. 이후에 이 값을 다시 사용할 수 없습니다.
getNumber1() 

// 리턴 값을 받아서 보관할 곳이 있으므로 무시되지 않습니다.
int num = getNumber();
System.out.println(num); // prints 1

0

나무늘보님의 프로필 이미지

안녕하세요. 윤성원님, 공식 서포터즈 코즈위버입니다.

AI 인턴 답변에 추가하면,

1,2번 모두 말씀하신 상황에서 소비자가 생산자에 signal을 보냈을 때 생산자가 아무도 없다면 소비자는 무한 대기상태에 빠지게 됩니다. 생산자가 와서 처리하고 소비자에게 signal을 줄 때까지 무한히 대기합니다.

감사합니다.

0

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

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

생산자 소비자 문제에서 대기 공간 분리와 관련된 메커니즘에 대해 깊이 있는 질문을 해주셨네요. 질문하신 내용을 바탕으로 관련된 예제를 설명해드리고, 도움을 드릴 수 있는 기존 답변을 안내하겠습니다.

  1. 소비자가 깨어나고, 생산자가 락을 받는 보장: 소비자가 깨어나서 producerCond.signal()을 호출할 때, producerCond에 실제 대기 중인 생산자가 없더라도, 해당 신호는 “신호 대기열”에 저장됩니다. 이로 인해 다음번에 조건이 만족할 때 새로 입장한 생산자가 신호를 받을 수 있습니다. 이 과정 덕분에 생산자들이 차례로 락을 획득할 수 있는 기회를 보장받을 수 있습니다.

  2. 생산자가 없을 때의 signal() 처리: 만약 producerCond.signal()이 호출되었을 때 대기 중인 생산자가 없다면, 앞서 설명한 것처럼 그 신호는 대기열로 보내져 이후에 실행될 생산자에게 전달됩니다. 이는 자바의 Condition 객체가 관리하는 자연스러운 메커니즘입니다.

이와 관련하여 김영한 강사님께서 좀 더 구체적으로 설명해 주신 유사한 질문이 있습니다. 다음 URL을 참고하시면 도움이 되실 것 같습니다: 스레드 기아상태 - 모든 스레드가 wait인 상황

이 링크에서는 스레드가 서로 상호작용하는 과정에서의 대기와 신호 처리에 관련해서 자세히 설명하고 있습니다. 윤성원님께서 추가적으로 이해하고 싶으신 부분에 대해서 해당 내용을 참조하시면 더 명확히 답을 얻을 수 있을 것입니다.

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