# wait & notify

img.png

  • Owner 线程发现条件不满足,调用 wait 方法,即可进入 WaitSet 变为 WAITING 状态
  • BLOCKED 和 WAITING 的线程都处于阻塞状态,不占用 CPU 时间片
  • BLOCKED 线程会在 Owner 线程释放锁时唤醒
  • WAITING 线程会在 Owner 线程调用 notify 或 notifyAll 时唤醒,但唤醒后并不意味者立刻获得锁,仍需进入EntryList 重新竞争

# API

  • obj.wait():让进入object监视器的线程到waitSet等待
  • obj.notify():在object上正在waitSet等待的线程中挑一个唤醒
  • obj.notifyA1l():让object.上正在waitSet等待的线程全部唤醒

它们都是线程之间进行协作的手段,都属于Object对象的方法。必须获得此对象的锁,才能调用这几个方法,如果没有获取到锁直接调用会报错

@Slf4j
public class Demo {
    private static Demo lock = new Demo();

    public static void main(String[] args) throws InterruptedException {
//        lock.wait(); java.lang.IllegalMonitorStateException

        synchronized (lock) {
            lock.wait();
            //do some thing
        }
    }
}