Front/JS & jQuery

[JAVA] Object.notify()

오선지♬ 2025. 9. 30. 09:01
728x90
반응형

wait() 과 같이 볼게요.

1️⃣ 기본 개념

wait()

  • 현재 스레드를 일시 정지시키는 메서드
  • 모니터 락을 해제하고 다른 스레드가 객체를 사용할 수 있게 함
  • 다른 스레드가 notify() 또는 notifyAll()을 호출하면 깨어남
  • 반드시 synchronized 블록 안에서 호출해야 함

notify()

  • wait()로 대기 중인 스레드 중 하나를 깨움
  • 객체의 모니터 락을 소유한 상태에서 호출해야 함
  • notifyAll()은 모든 대기 스레드를 깨움

💡 핵심: wait() = 기다림, notify() = 깨움

wait()와 notify()는 모든 객체에 존재

Object obj = new Object();
synchronized(obj) {
    obj.wait();    // obj 락 해제하고 기다림
    obj.notify();  // obj 대기 스레드 하나 깨움
}

2️⃣ 동작 구조

 
Thread A                 Thread B
--------                 --------
synchronized(obj)        synchronized(obj)
obj.wait()  <-----       obj.notify()
(락 해제, 대기)          (대기 스레드 중 하나 깨움)
  • wait() 호출: 락을 내려놓고 기다림 → 다른 스레드 접근 가능
  • notify() 호출: 기다리는 스레드 중 하나를 깨움 → 락이 해제될 때까지 대기

3️⃣ 예제: 생산자-소비자 패턴

 
class Data {
    private int value;
    private boolean available = false;

    public synchronized void produce(int val) {
        while (available) {   // 이미 데이터 있으면 기다림
            try { wait(); } catch (InterruptedException e) {}
        }
        value = val;
        available = true;
        notify();  // 소비자 깨움
    }

    public synchronized int consume() {
        while (!available) {  // 데이터 없으면 기다림
            try { wait(); } catch (InterruptedException e) {}
        }
        available = false;
        notify();  // 생산자 깨움
        return value;
    }
}

public class WaitNotifyDemo {
    public static void main(String[] args) {
        Data data = new Data();

        // 생산자 스레드
        new Thread(() -> {
            for (int i = 0; i < 5; i++) data.produce(i);
        }).start();

        // 소비자 스레드
        new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                int val = data.consume();
                System.out.println("Consumed: " + val);
            }
        }).start();
    }
}

✅ 동작 요약:

  1. 생산자가 데이터를 넣으려 할 때 이미 데이터가 있으면 wait() → 일시 정지
  2. 소비자가 데이터를 가져가면 notify() → 생산자 깨어남
  3. 이런 식으로 생산자와 소비자가 교대로 작업 가능

4️⃣ 핵심 포인트

메서드 설명 조건
wait() 현재 스레드 대기, 락 해제 synchronized 블록 안
notify() 대기 스레드 하나 깨움 synchronized 블록 안
notifyAll() 대기 스레드 모두 깨움 synchronized 블록 안
  • 중요: wait()와 notify()는 동기화된 상태에서만 의미가 있음
  • 락 없이 호출하면 IllegalMonitorStateException 발생
728x90
반응형