wait,notify区别

概述

  • 作用
  • 示例

作用

  • 对象之间相互通信的机制

示例

  • 类未实现线程时
此时类实例对象的wait()方法必须由另一个线程调用此类实例的notify()方法,此wait()方法下面的代码才能执行下去。
注:一定是同一个类实例对象即同一个对象。
wait(time)与wait()不同
wait(time)方法下面的代码块,或者是对象被另一个线程notify()后执行,或者是等待time时间后执行。
而wait()只能由notify()后执行
    • 注:此时类未实现多线程
    • 注:此时是对象的 wait() 方法和 notify() 方法
  • 类实现多线程时
<think>好的,用户想了解Java中waitnotify的用法区别。首先,我需要回忆这两个方法的基本概念,它们都属于Object类,用于线程间的协作。然后,考虑它们的用法,比如必须在同步块中使用,否则会抛出异常。需要解释wait会让线程释放锁,而notify会唤醒等待的线程。还要区分notifynotifyAll的不同。可能用户在使用多线程时遇到了协调问题,比如生产者-消费者模型。要结合实际例子说明,比如用synchronized块配合waitnotify实现线程等待唤醒。同时,注意sleep方法的区别,比如sleep不释放锁,而wait会释放。还要提到每个对象都有锁,所以waitnotify是针对对象监视器的。需要确保引用相关的参考资料,比如引用[4]中提到的sleepwait区别,这可能帮助用户更好地区分两者。最后,生成相关问题时要覆盖常见的使用场景、区别、常见错误以及替代方案等,帮助用户全面理解。记得检查是否符合格式要求,数学表达式用$...$,代码块正确,引用标识正确添加。</think>### Java中wait()与notify()的用法与区别 #### 一、基本定义 1. **wait()** 是$Object$类的方法,调用后当前线程会释放对象锁并进入等待状态,直到其他线程调用该对象的$notify()$或$notifyAll()$方法[^4]。 ```java synchronized (obj) { obj.wait(); // 释放锁,线程进入等待队列 } ``` 2. **notify()** 同样是$Object$类的方法,唤醒在此对象监视器上等待的单个线程,具体唤醒哪个线程由线程调度器决定。 ```java synchronized (obj) { obj.notify(); // 唤醒一个等待线程 } ``` #### 二、核心区别 | 特性 | wait() | notify() | |---------------------|-----------------------------------------|------------------------------| | **锁释放** | 立即释放锁 | 不释放锁(需退出同步块才释放)| | **调用要求** | 必须在同步块内调用 | 同左 | | **线程状态** | 进入等待队列(WAITING) | 无状态变化 | | **作用目标** | 当前线程 | 其他等待线程 | #### 三、典型应用场景 **生产者-消费者模型** ```java // 共享资源 Queue<Integer> buffer = new LinkedList<>(); int MAX_SIZE = 5; // 生产者线程 synchronized (buffer) { while (buffer.size() == MAX_SIZE) { buffer.wait(); // 缓冲区满时等待 } buffer.add(data); buffer.notifyAll(); // 通知消费者 } // 消费者线程 synchronized (buffer) { while (buffer.isEmpty()) { buffer.wait(); // 缓冲区空时等待 } buffer.poll(); buffer.notifyAll(); // 通知生产者 } ``` #### 四、关键注意事项 1. **必须与synchronized配合使用** 直接调用$wait()/notify()$会抛出$IllegalMonitorStateException$异常。 2. **循环检查条件** 建议使用`while`而非`if`判断条件,避免虚假唤醒(spurious wakeup)。 3. **notifyAll()更安全** `notify()`可能因随机唤醒不匹配条件的线程导致死锁,`notifyAll()`会唤醒所有等待线程竞争锁。 #### 五、与sleep()的对比 | 对比维度 | wait() | sleep() | |----------------|-----------------------------------------|------------------------------| | **锁行为** | 释放锁 | 不释放锁 | | **所属类** | Object | Thread | | **唤醒条件** | 需其他线程调用notify()/notifyAll() | 时间到期后自动恢复 | | **用途** | 线程间协作 | 单纯的时间延迟 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值