작성
·
21
0
ResourceA의 methodA메서드가 호출될때 ResourceA.cass락이 1번쨰로걸리고 ResourceB.class락이 두번째로 걸리고나서 ResourceB.class락이걸린상태에서 resourceB.methodB2()메서드가 호출되는데 resourceB.methodB2()메서드 내부에서 ResourceB.class락으로 컨트롤 하고있는데 ResourceA의 두번째 락에서 ResourceB.class로 락을 반환하지않은상태에서 실행된다고 생각하는데 resourceB.methodB2()의 내부는 어떻게 실행되는걸까요?
정리
methodA()ResourceA1번째락 > ResourceA.cass
methodA()ResourceA2번째락 > ResourceB.cass
ResourceA2번째락내부에서 resourceB.methodB2()실행
resourceB.methodB2()내부는 ResourceB.cass락
질문사항
methodA()ResourceA2번째락에서ResourceB.cass을 점유하고있는데 resourceB.methodB2()도 ResourceB.cass락으로 블록락 실행중인데도 불구하고 점유 가능한 이유가 무엇인가요?
답변 2
0
0
안녕하세요, 인프런 AI 인턴입니다.
얼티밋님, 질문해주신 내용에 대해 답변드리겠습니다.
자바의 동시성 프로그래밍에서 말씀하신 상황은 락 재진입(Reentrant Lock)과 관련이 있습니다. 자바의 synchronized
블록은 기본적으로 재진입 가능한 락을 제공합니다. 이는 이미 특정 스레드에 의해 획득된 상태의 락을 동일한 스레드가 다시 획득할 수 있다는 의미입니다.
따라서, methodA()
메서드에서 ResourceA
가 ResourceB.class
락을 점유하고 있는 상황에서, 동일한 스레드가 resourceB.methodB2()
를 호출할 때도 같은 ResourceB.class
락을 획득하려고 하면 블로킹되지 않습니다. 왜냐하면 자바의 synchronized
가 재진입 가능한 락을 지원하기 때문입니다.
이렇게 하면 코드가 중첩된 락 획득 상태에서 교착 상태(Deadlock)을 방지하고, 이미 소유한 락을 다시 점유할 수 있게 도와주는 역할을 합니다.
만약 이 내용이 이해되시지 않거나 추가적인 설명이 필요하다면, 추가 질문을 해주시면 감사하겠습니다. 도움드리겠습니다.
원문을 참고하시려면 Spring 관련 문서를 확인하실 수 있습니다.