inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

synchronized 코드 블럭

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

233

노동준

작성한 질문수 24

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 블록의 파라미터는 위와 같은 상황을 위해 특정 인스턴스의 락을 파라미터로 잡게 한건가요?

java 객체지향 동시성 multithread thread

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 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에 대해 동기화되어 있기 때문에 동시성 문제를 방지할 수 있습니다.

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

모니터와 synchronized, ReentrantLock, 원자적연산 CAS관련해서 추가적으로 더 깊게 공부했는데 제가 이해한 것이 맞나요??

0

89

1

Future cancel기능을 사용했지만 interrupt가 발생하지 않을 때 어떻게 처리해야하나요?

0

75

2

2.스레드 생성과 실행 - 17P 그림 문의

0

75

2

자바 동시성 현업에서 사용예시가 궁금합니다

0

143

1

ReentrantLock 동작 원리에 대한 질문입니다.

0

86

1

synchronized 대신 join 을 사용하여 순서를 보장할 경우 해법이 아닌가요?

0

97

2

메모리 가시성 문제 질문

0

74

1

Future4-이유 질문

0

65

1

오타 제보

0

77

2

runnable 질문

0

99

2

자바가 아닌 다른 언어에서도

0

115

1

메모리 가시성 문제가 발생하는 이유

0

128

1

데몬스레드가 어떨 때 사용이 되는지 궁금합니다.

0

81

1

Future.cancel() 취소를 사용하는 예가 궁금합니다.

0

85

1

synchronized 와 인스턴스의 lock

0

92

2

synchronized 키워드만으로 메모리 가시성이 해결되는 이유가 궁급합니다.

0

66

1

[스레드 풀과 Executor 프레임워크1][문제와 풀이] `log("일부 작업이 실패했습니다.");` 실행되는 경우가 있을까요?

0

60

1

원자적 연산이 멀티스레드 상황에서 안전한 이유를 제대로 이해했는지 확인 부탁드립니다

0

70

2

자바 고급 1,2,3편 같이 진행해도 문제없나요

0

79

2

CPU 캐시 때문에도 잔액이 200원이 될 수 있나요?

0

105

2

synchronized 메서드와 join 관련 질문이 있습니다.

0

71

2

섹션 14. 115번 강의 내용 질문

0

83

2

교안에 있는 7페이지 데이터 영역

0

51

1

Executor 스레드 풀 관리 질문

0

109

2