생산자 소비자 대기 공간 분리 예제5 분석 질문
187
6 asked
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.
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%의 보장이 어떻게 이루어지는지 그게 궁금합니다.
질문을 요약해서 적겠습니다.
대기상태에서 깨어난 소비자가 producerCond에 signal을 보낼때 producerCond에 대기하고 있던 생산자가 하나도 없는데 어떻게 생산자가 그 락을 받는다는 100%의 보장을 할 수 있는지?
대기상태에서 깨어난 소비자가 producerCond에 signal을 보낼때 producerCond에 대기하고 있던 생산자가 하나도 없는데 이럴때 소비자가 보낸 producerCond.signal(); 은 어떻게 처리가 되는지?
감사합니다.
Answer 4
0
질문하신 대기상태에 있던 소비자1이 깨어나서 소비를 하고 producerCond에 signal을 줄때 producerCond에 대기중인 생산자가 하나도 없지 않습니까? 그럼 이때 생산자가 락을 받는다는 100%의 보장이 어떻게 이루어지는지 궁금하시다는 거에 답변드려보겠습니다.
먼저 소비자 스레드 3개가 실행되어 대기 집합에 들어간 뒤, 생산자 스레드 3개는 0.1초 마다 실행하게 됩니다.
그러므로 생산자 1이 put을 진행하는 동안 생산자 스레드 2,3은 생산자 1의 lock 이 해제될때 까지 기다리고 있는 상태죠.
( V2 에서 생산자 먼저 실행해보시면 생산자 스레드 3이 모니터 락을 가진 상태에서 while문을 무한 반복하고 있고, 소비자 스레드 3개 모두 실행되었지만 이미 생산자 스레드 3에서 락을 획득했기 때문에 락이 해제되기 까지 BLOCKED 상태로 로그가 출력됐던 것을 보시면 됩니다. )
즉, 생산자 1의 lock이 해제되는 순간 다른 생산자 스레드들이 lock을 얻을 수 있게 되는거죠.
먼저 이해하셔야 될 부분이 생산자 스레드들은 대기 집합과 관계없이 lock이 해제되면 바로 실행될 수 있는 상태이고, 소비자 스레드 1,2,3은 생산자 스레드의 signal() 호출을 통해서만 대기 집합에서 나와 작업을 실행할 수 있습니다.
그러므로 질문자님이 물어보신 소비자 1이 깨어나서 소비를 하고 producerCond에 대기중인 생산자가 하나도 없지만 생산자가 락을 100% 받을 수 있는 이유는 소비자 2와3은 대기 집합에서 생산자 스레드의 signal() 호출을 무한정 기다리고 있는 상태이며, 다른 생산자 스레드들은 소비자1 스레드의 unlock() 이 호출되자마자 lock을 획득하여 작업을 수행하기 때문입니다.
0
AI 인턴은 signal()을 받을 생산자가 없다면 신호가 대기열로 보내진다고 했는데, 이는 잘못된 답변같아서 적습니다.
혹시 다른 의견들 있으시면 답글 바랍니다.
소비자가 producerCond에 signal()을 보낼 때 producerCond에 생산자가 대기하고 있고, 락을 양보받는다.를 보장할 수 없습니다.producerCond.signal()을 호출하려면 producerCond.await()가 호출된 적이 있어야 한다등의 조건을 사용하여 이를 보장하도록 할 수는 있겠으나, (저도 아직 뒷부분을 학습하지는 않아서) 현재까지 배운 내용으로는 보장할 수 없다고 생각하는 것이 맞습니다.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 인턴입니다. 윤성원님.
생산자 소비자 문제에서 대기 공간 분리와 관련된 메커니즘에 대해 깊이 있는 질문을 해주셨네요. 질문하신 내용을 바탕으로 관련된 예제를 설명해드리고, 도움을 드릴 수 있는 기존 답변을 안내하겠습니다.
소비자가 깨어나고, 생산자가 락을 받는 보장: 소비자가 깨어나서
producerCond.signal()을 호출할 때,producerCond에 실제 대기 중인 생산자가 없더라도, 해당 신호는 “신호 대기열”에 저장됩니다. 이로 인해 다음번에 조건이 만족할 때 새로 입장한 생산자가 신호를 받을 수 있습니다. 이 과정 덕분에 생산자들이 차례로 락을 획득할 수 있는 기회를 보장받을 수 있습니다.생산자가 없을 때의
signal()처리: 만약producerCond.signal()이 호출되었을 때 대기 중인 생산자가 없다면, 앞서 설명한 것처럼 그 신호는 대기열로 보내져 이후에 실행될 생산자에게 전달됩니다. 이는 자바의Condition객체가 관리하는 자연스러운 메커니즘입니다.
이와 관련하여 김영한 강사님께서 좀 더 구체적으로 설명해 주신 유사한 질문이 있습니다. 다음 URL을 참고하시면 도움이 되실 것 같습니다: 스레드 기아상태 - 모든 스레드가 wait인 상황
이 링크에서는 스레드가 서로 상호작용하는 과정에서의 대기와 신호 처리에 관련해서 자세히 설명하고 있습니다. 윤성원님께서 추가적으로 이해하고 싶으신 부분에 대해서 해당 내용을 참조하시면 더 명확히 답을 얻을 수 있을 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
모니터와 synchronized, ReentrantLock, 원자적연산 CAS관련해서 추가적으로 더 깊게 공부했는데 제가 이해한 것이 맞나요??
0
84
1
Future cancel기능을 사용했지만 interrupt가 발생하지 않을 때 어떻게 처리해야하나요?
0
72
2
2.스레드 생성과 실행 - 17P 그림 문의
0
73
2
자바 동시성 현업에서 사용예시가 궁금합니다
0
133
1
ReentrantLock 동작 원리에 대한 질문입니다.
0
81
1
synchronized 대신 join 을 사용하여 순서를 보장할 경우 해법이 아닌가요?
0
93
2
메모리 가시성 문제 질문
0
69
1
Future4-이유 질문
0
64
1
오타 제보
0
74
2
runnable 질문
0
95
2
자바가 아닌 다른 언어에서도
0
111
1
메모리 가시성 문제가 발생하는 이유
0
125
1
데몬스레드가 어떨 때 사용이 되는지 궁금합니다.
0
78
1
Future.cancel() 취소를 사용하는 예가 궁금합니다.
0
84
1
synchronized 와 인스턴스의 lock
0
90
2
synchronized 키워드만으로 메모리 가시성이 해결되는 이유가 궁급합니다.
0
62
1
[스레드 풀과 Executor 프레임워크1][문제와 풀이] `log("일부 작업이 실패했습니다.");` 실행되는 경우가 있을까요?
0
59
1
원자적 연산이 멀티스레드 상황에서 안전한 이유를 제대로 이해했는지 확인 부탁드립니다
0
67
2
자바 고급 1,2,3편 같이 진행해도 문제없나요
0
77
2
CPU 캐시 때문에도 잔액이 200원이 될 수 있나요?
0
105
2
synchronized 메서드와 join 관련 질문이 있습니다.
0
69
2
섹션 14. 115번 강의 내용 질문
0
82
2
교안에 있는 7페이지 데이터 영역
0
51
1
Executor 스레드 풀 관리 질문
0
108
2

