작성
·
91
·
수정됨
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을 포함하여 보다 명확하게 이해하실 수 있도록 설명드리겠습니다.
두 링크 모두 synchronized 블록과 관련된 동시성 문제 및 처리 방식에 대한 논의가 포함되어 있으니 참고하시면 도움이 될 것입니다.
synchronized
블록에서 특정 인스턴스를 파라미터로 지정하는 이유는 해당 인스턴스의 모니터 락을 사용하여 동기화를 보장하기 위해서입니다. 이는 아래와 같은 이유로 사용됩니다:
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
에 대해 동기화되어 있기 때문에 동시성 문제를 방지할 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.