인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

노동준님의 프로필 이미지
노동준

작성한 질문수

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

synchronized 코드 블럭

synchronized 코드블록에서 사용하는 파라미터의 존재 이유

작성

·

117

·

수정됨

0

 학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.


1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
synchronized (){} 블록에서 파라미터로 인스턴스를 지정하는 이유가 혹시 다른 클래스에 있는 메서드와의 동시성 연결..? 때문일까요?

예를 들어 이러한 사고 실험을 해보았습니다)
A 클래스에 a 메서드를 실행하면 해당 메서드에서 내부적으로
B 클래스에 b 메서드를 실행한다고 가정을 하겠습니다.

하지만 b 메서드는 a 메서드를 통해서만 호출되는 것이 아니라 자체적으로도 호출하는 메서드라고 했을 때, 나타나는 동시성을 고려한 것일까 의문이 들었습니다.

 

그렇다고 한다면,

b 메서드 안에 synchronized (b 클래스의 인스턴스) {} 를 지정하여,
a 메서드를 통해 호출되는 b 메서드와 B 클래스 자체적으로 호출하는 b 메서드의 동시성 문제를 해결할 수 있겠다 예상이 됩니다.

synchronized 블록의 파라미터는 위와 같은 상황을 위해 특정 인스턴스의 락을 파라미터로 잡게 한건가요?

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. 노동준님.

실전 자바 - 고급 1편, 멀티스레드와 동시성 강의와 관련된 synchronized 블록과 동시성 문제에 대한 질문을 주셨군요. 비슷한 내용이 강의 게시판에서 다뤄진 적이 있습니다. 관련 답변 URL을 포함하여 보다 명확하게 이해하실 수 있도록 설명드리겠습니다.

  1. Blocked 되지 않는 문제
  2. synchronized lock 획득 질문, 스프링에서 synchronized 질문

두 링크 모두 synchronized 블록과 관련된 동시성 문제 및 처리 방식에 대한 논의가 포함되어 있으니 참고하시면 도움이 될 것입니다.

핵심 요약

synchronized 블록에서 특정 인스턴스를 파라미터로 지정하는 이유는 해당 인스턴스의 모니터 락을 사용하여 동기화를 보장하기 위해서입니다. 이는 아래와 같은 이유로 사용됩니다:

  • 동기화 제어: 특정 인스턴스의 락을 사용하는 synchronized 블록을 통해, 해당 인스턴스를 공유하는 모든 스레드가 동기화된 방식으로 접근하도록 보장합니다. 이를 통해, 일정 시점에서 하나의 스레드만이 임계 구역을 실행하도록 제어합니다.
  • 동시성 문제 해결: A 클래스의 a 메서드가 B 클래스의 b 메서드를 호출하는 경우와 같이, 두 메서드가 동일한 B 클래스 인스턴스를 공유하는 상황에서 동시성 문제를 해결하는 데 유효합니다.
class A {
    private B bInstance = new B();
    public void a() {
        // 동기화된 블록으로 bInstance 접근
        synchronized(bInstance) {
            bInstance.b();
        }
    }
}

class B {
    public void b() {
        synchronized(this) {
            // 임계 구역 코드
        }
    }
}

위 코드 예시는 a 메서드와 b 메서드가 동일한 bInstance에 대해 동기화되어 있기 때문에 동시성 문제를 방지할 수 있습니다.

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

노동준님의 프로필 이미지
노동준

작성한 질문수

질문하기