Inflearn brand logo image

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

트릴님의 프로필 이미지
트릴

작성한 질문수

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

ReentrantLock - 활용

9:06초에서 이해가 안가는 부분 (unlock)

작성

·

74

0

비공정 모드에서는 스레드 경쟁 상태가 되어 어떤 스레드가 락을 획득 할 지 보장이 안되는건 이해가 됐습니다.

다만 교안에는 이미지 처럼 하나 깨운다 라고 되어있는데, 그러면 경쟁 상태가 의미가 있는지요?

한번에 여러 스레드가 unpark되는게 아니라면 왜 레이스 컨디션 문제가 발생하는지 궁금합니다.

 

image.png

 

답변 2

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 트릴님

단순히 이 그림에 있는 예시만 보는 것이 아니라 좀 더 넓게 생각해야 이해가 되는 문제인데요.

예를 들어서 락 반납 후에 깨어난 스레드가 락 획득을 시도 할 때, 여기에 추가로 외부에 있는 별도의 스레드에서도 락 획득을 시도한다면 레이스 컨디션 문제가 발생할 수 있습니다.

감사합니다.

0

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

트릴님의 질문은 비공정 모드에서의 스레드 경쟁 상황과 레이스 컨디션 문제에 대한 것입니다. 관련 내용을 설명드리겠습니다.

비공정 모드에서의 ReentrantLock은 락을 반납하는 순간 대기 중인 스레드를 하나 깨우거나, 특정 조건을 기반으로 대기 큐에 있는 여러 스레드가 경쟁 상태에 들어갈 수 있습니다. 이는 LockSupport.unpark(thread) 메서드를 통해 이루어지는데, 해당 메서드는 대기 중인 스레드 중 하나를 깨우는 역할을 합니다.

여기서 레이스 컨디션이 발생하는 주된 이유는, 스레드가 깨어나는 시점과 락을 실제로 획득하는 순간 사이에 다른 스레드가 먼저 락을 취득할 수 있기 때문입니다. 단순히 하나의 스레드만을 깨운다고 하여도 그 스레드가 락을 획득하기 전까지 다른 스레드에 의해 락이 획득될 수 있는 가능성이 있으므로, 락을 얻기 위한 경쟁 상황이 발생할 수 있습니다.

또한 여러 스레드가 동시에 대기하고 있다는 점에서, 특정 스레드가 언제 깨어나서 락을 획득할지는 예상하기 어렵기 때문에, 여전히 레이스 컨디션(선점에 대한 불확실성)이 해결되지 않은 상태로 남아있게 됩니다.

트릴님의 질문에 대해, 스레드를 하나만 깨운다고 하더라도 그 스레드가 락을 현실적으로 언제 획득할 수 있을지는 비공정 모드에서 보장되지 않는 점이 경쟁 상태를 유발하는 핵심 포인트입니다.

관련된 내용을 더 깊이 이해하시려면, 아래 유사한 질문을 참고하세요:

  1. 스레드 대기 ReentrantLock 설명 부분: 락 획득 대기 중인 스레드의 상태에 대해 다루고 있습니다.
  2. unlock()을 호출 했을 때: unlock 이후 스레드의 경쟁 상태에 대한 이해를 돕습니다.

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

트릴님의 프로필 이미지
트릴

작성한 질문수

질문하기