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

얼티밋님의 프로필 이미지
얼티밋

작성한 질문수

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

Deadlock - 교착상태 - 2

16:50부분에서 타입락 질문드립니다.

작성

·

21

0

ResourceA의 methodA메서드가 호출될때 ResourceA.cass락이 1번쨰로걸리고 ResourceB.class락이 두번째로 걸리고나서 ResourceB.class락이걸린상태에서 resourceB.methodB2()메서드가 호출되는데 resourceB.methodB2()메서드 내부에서 ResourceB.class락으로 컨트롤 하고있는데 ResourceA의 두번째 락에서 ResourceB.class로 락을 반환하지않은상태에서 실행된다고 생각하는데 resourceB.methodB2()의 내부는 어떻게 실행되는걸까요?

정리

  1. methodA()ResourceA1번째락 > ResourceA.cass

  2. methodA()ResourceA2번째락 > ResourceB.cass

  3. ResourceA2번째락내부에서 resourceB.methodB2()실행

  4. resourceB.methodB2()내부는 ResourceB.cass락

질문사항

methodA()ResourceA2번째락에서ResourceB.cass을 점유하고있는데 resourceB.methodB2()도 ResourceB.cass락으로 블록락 실행중인데도 불구하고 점유 가능한 이유가 무엇인가요?

답변 2

0

정수원님의 프로필 이미지
정수원
지식공유자

그건 동일한 스레드가 점유하고 있는 락입니다.

아래 설명도 있지만 스레드는 동일한 락에 대한 재진입을 허용하기 때문에 별도의 대기를 필요로 하지 않습니다.

0

안녕하세요, 인프런 AI 인턴입니다.
얼티밋님, 질문해주신 내용에 대해 답변드리겠습니다.

자바의 동시성 프로그래밍에서 말씀하신 상황은 락 재진입(Reentrant Lock)과 관련이 있습니다. 자바의 synchronized 블록은 기본적으로 재진입 가능한 락을 제공합니다. 이는 이미 특정 스레드에 의해 획득된 상태의 락을 동일한 스레드가 다시 획득할 수 있다는 의미입니다.

따라서, methodA() 메서드에서 ResourceAResourceB.class 락을 점유하고 있는 상황에서, 동일한 스레드가 resourceB.methodB2()를 호출할 때도 같은 ResourceB.class 락을 획득하려고 하면 블로킹되지 않습니다. 왜냐하면 자바의 synchronized가 재진입 가능한 락을 지원하기 때문입니다.

이렇게 하면 코드가 중첩된 락 획득 상태에서 교착 상태(Deadlock)을 방지하고, 이미 소유한 락을 다시 점유할 수 있게 도와주는 역할을 합니다.

만약 이 내용이 이해되시지 않거나 추가적인 설명이 필요하다면, 추가 질문을 해주시면 감사하겠습니다. 도움드리겠습니다.

원문을 참고하시려면 Spring 관련 문서를 확인하실 수 있습니다.

얼티밋님의 프로필 이미지
얼티밋

작성한 질문수

질문하기