작성
·
153
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()
를 사용하여 보다 세밀한 동작을 구현할 수 있습니다.