inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]

스레드 풀 이해와 구현

[ 스레드 풀 이해와 구현 ] 예시코드 버그

해결된 질문

638

식빵

작성한 질문수 56

0

선생님 안녕하세요. 강의를 듣다가 조금 이상한 부분이 있어서 문의드립니다.

[ 스레드 풀 이해와 구현 ] 강의에서 작성하는 코드를 저도 그대로 따라치면서 실습을 하고 있는데요.
그런데 예시 코드의 동작에 약간의 문제를 발견했습니다.

 

강의에서 보여주는 코드는 아래와 WorkerThread 코드는 아래와 같습니다.

 

그런데 제가 한 ThreadPoolMain 클래스에서 Task 를 3000 개 정도 주고, ThreadPoolSize =20 을 주고 돌려보니까, 2가지 이상현상을 확인했습니다.

1. Null Poiniter Exception 발생

  1. 중복 처리


각각의 문제가 발생하는 이유를 정리해보니 다음과 같더라구요.

 

// 시나리오 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();

 

혹시 코드를 아래처럼 짜야 되는 게 아닌지 조심스럽게 문의해봅니다.

 

 

java 동시성 multithread synchronisation

답변 3

1

정수원

아 네

그렇군요

질문 내용이 맞습니다

if (!taskQueue.isEmpty()) {

task = taskQueue.poll();

} else {

continue;

}

위 구문도 스레드에 안전하지 않습니다.

일반적으로 taskQueue 같은 경우 BlockingQueue 를 사용하기 때문에 동기화 처리나 중복처리가 기본적으로 구현되어 있기 때문에 동기화 처리를 하지 않았는데 알고보니 BlockingQueue 를 사용하지 않았네요

그렇다면 별도로 동기화 처리를 해 주어야 하기 때문에 synchronized 로 묶어 주어야 합니다.

일단 이번 챕터는 완성된 스레드 풀에 대한 구현을 설명하기 보다는 아주 간단하지만 기본적인 스레드 풀의 흐름을 이해하기 위한 목적으로 이해해 주시면 되겠습니다.

감사합니다.

 

0

선종우

저도 강의 보던 중 이상한 거 같아서 와보니 이미 질문을 올려주셨었네요 ㅎㅎ 질문과 답변 도움되었습니다

-3

인프런 AI 인턴

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

식빵님께서 질문하신 스레드 풀의 동작 문제와 관련하여, 강의 중에서 강사님이 context switching에 대해 설명한 내용이 도움이 될 것 같습니다. 이와 관련하여 다른 학습자의 질문에 대한 답변이 이미 제공되어 있으니, 아래 링크를 참고하시어 유사한 문제를 해결하는 데 도움이 되시길 바랍니다.

강의: 자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
제목: [스레드 중지 – flag variable vs interrupt() - 2] 강의 Context Switch 관련 질문있습니다.

답변 링크: 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