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

세진:)님의 프로필 이미지
세진:)

작성한 질문수

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

Monitor - 모니터 - 1

synchronized = 모니터

작성

·

140

0

안녕하세요!

좋은강의 해주셔서 감사합니다!

저는 모니터라는 개념에 대해 잘 이해를 못하다가 이번 강의를 통해 좀 알것 같기도 한데 애매한 부분이 있어서 질문드리고자 합니다~

강의 내용을 보면 synchronized = 모니터라고 볼 수 있을 것 같은데, 41분쯤에 장표에서 나온 모니터는 lock.wait()과 lock.notify()로 구현되어있잖아요!

그런데 저는 지금까지 동기화 코드를 작성할때 Object클래스의 wait()이나 notify()함수를 사용안하고, synchronized만 사용해도 동기화가 잘 됬던것 같거든요!

synchronized만 사용할때랑 자바 모니터로 구현할때랑 무엇이 다른건지 아직 좀 잘 모르겠습니다..

답변 2

0

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

네 이부분은 wait(), notify() 챕터에서 좀 더 자세하게 다루고 있으니 참고해 주시면 되겠습니다.

synchronized 는 모니터 개념을 포함하고 있는 동기화 기법입니다. 좀 더 모니터를 편리하게 사용할 수 있도록 자바가 만든 고수준의 동기화 기법입니다.

wait(), notify() 는 synchronized 와 함께 사용할 수 있는 동기화 기법으로서 좀 더 세밀하게 락을 컨트롤 할 수 있습니다.

즉 사용자가 직접 락을 대기하거나 해제할 수 있는 기능을 제공합니다.

모니터는 내부적으로 그런 기능을 사용하고 있다고 보시면 됩니다.

0

안녕하세요, 인프런 AI 인턴입니다.

세진:)님의 질문에 대해 답변드립니다. synchronized 키워드와 wait(), notify() 메소드는 자바의 동기화 방법들 중 일부입니다. synchronized 키워드를 사용하면 어떤 객체나 메소드에 대한 동시 접근을 막아, 한 시점에 하나의 스레드만 접근할 수 있게 합니다. 이는 ‘모니터 락’을 사용하는 방식으로, 해당 블록이나 메소드에 진입하는 스레드가 모니터 락을 획득하고, 빠져나갈 때 락을 반환합니다.

wait(), notify(), notifyAll() 메소드를 사용하는 동기화는 좀 더 세밀한 컨트롤을 가능하게 합니다. 이 메소드들은 synchronized 블록 내에서만 사용할 수 있으며, 객체의 모니터 락을 기다리거나, 락을 기다리는 다른 스레드들을 깨우는 역할을 합니다. wait() 메소드를 호출하는 스레드는 해당 객체의 락을 해제하고 대기 상태에 들어가며, notify()notifyAll() 메소드에 의해 다시 활성화되면 락을 재획득하고 실행을 계속합니다.

즉, synchronized만 사용하는 경우에는 여러 스레드가 동시에 접근하는 것을 방지하여 코드 블록이나 메소드가 한번에 하나의 스레드에 의해서만 실행되도록 합니다. 반면, wait()notify(), notifyAll() 메소드를 사용하는 경우에는 특정 조건에서 스레드를 대기시키거나 다시 실행시키는 등의 보다 세밀한 동기화 제어가 가능해집니다.

따라서, synchronized만 사용했을 때 잘 동작한 것은 동시 접근을 방지해 동기화가 필요한 부분을 적절히 제어했기 때문입니다. 하지만, 스레드 간의 상호작용이나 특정 조건에서의 동기화 제어가 필요한 경우에는 wait(), notify(), notifyAll()를 사용하여 보다 세밀한 동작을 구현할 수 있습니다.

세진:)님의 프로필 이미지
세진:)

작성한 질문수

질문하기