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();
}
}
✅ 동작 요약:
- 생산자가 데이터를 넣으려 할 때 이미 데이터가 있으면 wait() → 일시 정지
- 소비자가 데이터를 가져가면 notify() → 생산자 깨어남
- 이런 식으로 생산자와 소비자가 교대로 작업 가능
4️⃣ 핵심 포인트
메서드 | 설명 | 조건 |
wait() | 현재 스레드 대기, 락 해제 | synchronized 블록 안 |
notify() | 대기 스레드 하나 깨움 | synchronized 블록 안 |
notifyAll() | 대기 스레드 모두 깨움 | synchronized 블록 안 |
- 중요: wait()와 notify()는 동기화된 상태에서만 의미가 있음
- 락 없이 호출하면 IllegalMonitorStateException 발생
728x90
반응형
'Front > JS & jQuery' 카테고리의 다른 글
[js] Date 객체끼리 뺄셈(-) (0) | 2025.10.04 |
---|---|
[js] getTime() (0) | 2025.10.03 |
[JAVA] StringUtils.defaultIfEmpty()/ StringUtils.defaultIfBlank() (0) | 2025.09.23 |
[js]for (const [typeTp, items] of Object.entries(grouped)) (0) | 2025.09.17 |
[js] toLocaleString (0) | 2025.09.15 |