의문점 공부하기/📌 Java

📌 notify()와 notifyAll()의 차이는 뭘까?!

아리빠 2023. 7. 25. 10:27

- notify()와 notifyAll()은 자바에서 스레드 간의 통신을 위해 사용되는 메서드

notify():

  • notify() 메서드는 현재 객체의 모니터를 소유하고 있는 스레드 중 하나를 깨워서 실행을 재개
  • notify() 메서드를 호출하면 대기 중인 스레드 중 한 개의 스레드만 실행을 재개하고, 나머지 스레드들은 여전히 대기 상태...!
  • 선택적으로 특정 스레드를 깨울 수 있다
  • 호출한 스레드와 동일한 모니터를 소유하고 있는 스레드 중 하나가 깨어난다
  • notify() 메서드를 호출한 스레드와 동일한 모니터를 소유하고있는 스레드가 없다면, notify() 호출은 아무런 효과가 없다

notifyAll():

  • notifyAll() 메서드는 현재 객체의 모니터를 소유하고 있는 모든 스레드를 깨워서 실행을 재개
  • notifyAll() 메서드를 호출하면 대기 중인 모든 스레드가 실행을 재개
  • notifyAll() 메서드를 호출하면 대기 중인 모든 스레드가 경쟁 상태에 들어가게 되고, 모니터를 소유하고 있는 스레드 중 하나만 실행을 계속
  • notify() 와 마찬가지로 notifyAll() 메서드를 호출한 스레드와 동일한 모니터를 소유하고 있는 스레드가 없다면, notifyAll() 호출은 아무런 효과가 없다
 

이 두 메서드는 wait() 메서드와 함께 사용되어 스레드 간의 동기화를 달성하는 데 사용

- wait() 메서드는 스레드를 일시적으로 대기 상태로 만들고,

notify()나 notifyAll() 메서드를 호출하여 대기 중인 스레드를 깨워서 실행을 재개한다