[ 스레드 풀 이해와 구현 ] 예시코드 버그
선생님 안녕하세요. 강의를 듣다가 조금 이상한 부분이 있어서 문의드립니다.
[ 스레드 풀 이해와 구현 ] 강의에서 작성하는 코드를 저도 그대로 따라치면서 실습을 하고 있는데요.
그런데 예시 코드의 동작에 약간의 문제를 발견했습니다.
강의에서 보여주는 코드는 아래와 WorkerThread 코드는 아래와 같습니다.

그런데 제가 한 ThreadPoolMain 클래스에서 Task 를 3000 개 정도 주고, ThreadPoolSize =20 을 주고 돌려보니까, 2가지 이상현상을 확인했습니다.
1. Null Poiniter Exception 발생
중복 처리
각각의 문제가 발생하는 이유를 정리해보니 다음과 같더라구요.
NPE 발생 원인
// 시나리오 1
if (!taskQueue.isEmpty()) {
// 쓰레드 A,B 2개가 동시에 여기에 접근
// 쓰레드 A 가 먼저 Poll 을 해서 가져가버림.
// 쓰레드 B 는 비어있는 Queue 에 대하여 poll, null 을 반환 받음
task = taskQueue.poll();
} else {
continue;
}
// 쓰레드 A 는 정상 시작
// 쓰레드 B 는 NullPointerException!
task.run();
중복처리 원인
// 시나리오 2
if (!taskQueue.isEmpty()) {
// 쓰레드 A,B 2개가 동시에 여기에 접근
// 쓰레드 A 가 먼저 Poll 을 해서 가져 가버림.
// 쓰레드 B 도 Poll 해서 task 를 가져감.
task = taskQueue.poll();
} else {
continue;
}
// 쓰레드 A 는 작업 시작
// 쓰레드 B 도 중복으로 해당 task 실행
task.run();
혹시 코드를 아래처럼 짜야 되는 게 아닌지 조심스럽게 문의해봅니다.
답변 3
1
아 네
그렇군요
질문 내용이 맞습니다
if (!taskQueue.isEmpty()) {
task = taskQueue.poll();
} else {
continue;
}
위 구문도 스레드에 안전하지 않습니다.
일반적으로 taskQueue 같은 경우 BlockingQueue 를 사용하기 때문에 동기화 처리나 중복처리가 기본적으로 구현되어 있기 때문에 동기화 처리를 하지 않았는데 알고보니 BlockingQueue 를 사용하지 않았네요
그렇다면 별도로 동기화 처리를 해 주어야 하기 때문에 synchronized 로 묶어 주어야 합니다.
일단 이번 챕터는 완성된 스레드 풀에 대한 구현을 설명하기 보다는 아주 간단하지만 기본적인 스레드 풀의 흐름을 이해하기 위한 목적으로 이해해 주시면 되겠습니다.
감사합니다.
-3
안녕하세요, 인프런 AI 인턴입니다.
식빵님께서 질문하신 스레드 풀의 동작 문제와 관련하여, 강의 중에서 강사님이 context switching에 대해 설명한 내용이 도움이 될 것 같습니다. 이와 관련하여 다른 학습자의 질문에 대한 답변이 이미 제공되어 있으니, 아래 링크를 참고하시어 유사한 문제를 해결하는 데 도움이 되시길 바랍니다.
강의: 자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
제목: [스레드 중지 – flag variable vs interrupt() - 2] 강의 Context Switch 관련 질문있습니다.
답변 링크: Context Switch와 스레드 중지에 대한 강의 질문
이미지 링크:
위 링크에서 스레드의 실행과 중단에 관한 상세한 설명을 찾아보시고, 코드의 문제를 해결하는 데 참고해 보시기 바랍니다.
멀티스레드 단일스레드
0
56
0
new Condition 부분 질문
0
81
1
13:00 강의 내용 이해 질문
0
99
1
강의 출시 질문 있습니다.
0
114
1
InterruptedExceptionThreadStopExample 질문입니다.
0
94
2
instance.getMyField()의 값이 왜 다른가요?
0
115
1
해당 강의 내용 무단 도용 신고
0
211
2
Thread Waiting 상태 관련 질문 드립니다.
0
182
1
단일연산변수 api
0
125
0
synchronized 블럭과 메인메모리 반영
0
146
0
실무에서 자바가 제공하는 락을 사용하는 경우
1
243
1
뮤텍스나 세마포어는 busy waiting이 없는 게 맞을까요?
0
158
1
16:50부분에서 타입락 질문드립니다.
0
110
2
16분 7초 뮤텍스 코드 관련해 질문드립니다.
0
160
2
동기화가 보장된다고 하더라도 스레드간 데이터 불일치가 발생할 수 있지 않나요??
0
199
2
리액티브-part2
0
180
2
문자열 풀 값을 이용한 String 변수
0
207
2
스레드 라이브러리는 커널과 같은 역할을 하지 못하나요?
0
173
1
자식 프로세스를 쓰는 이유
0
186
1
커널 모드 전환시 질문이 있습니다!
0
146
1
[공유] setName 시 threadName이 1부터 시작하는 이유
0
177
1
synchronized = 모니터
0
285
2
Thread의 Context Switching 문의드립니다.
1
254
1
동기 & 논블록킹 질문 드립니다.
0
232
2





