wait() | sleep() | |
|---|---|---|
| Thuộc | Object (instance method) | Thread (static method) |
| Monitor lock | Nhả lock khi chờ | Giữ nguyên lock |
| Đánh thức | notify()/notifyAll() hoặc timeout | Hết thời gian |
| Điều kiện gọi | Phải trong synchronized (không thì IllegalMonitorStateException) | Gọi ở đâu cũng được |
| Dùng cho | Phối hợp giữa các thread (producer–consumer) | Tạm dừng thread hiện tại |
Điểm ăn điểm: wait() nhả lock để thread khác vào thay đổi điều kiện rồi notify() — đây là nền của producer–consumer. sleep() giữ lock, nên sleep bên trong synchronized sẽ chặn mọi thread khác cần lock đó suốt thời gian ngủ.
Lưu ý: wait() phải gọi trong vòng lặp kiểm tra điều kiện (while (!condition) wait();) — vì có spurious wakeup (thức dậy không do notify). Code hiện đại ưu tiên BlockingQueue, CountDownLatch, Condition thay vì wait/notify thủ công.