wait notify的正确使用

wait notify的正确使用

在开始之前,我们先看看Sleep和wait的区别和共同点
1、sleep是thread的方法,而wait是Object的方法
2、sleep是不需要强制和synchronized使用,而wait需要强制和synchronized使用
3、sleep在睡眠的通时,不会释放锁对象,但wait在等待的 时候会释放锁对象
4、sleep和wait的线程状态一致,都是有时限等待:TIMED_WAITNG

下面看一段代码

public static Object lock = new  Object;
public volatile int i  = 0;
//这是第一个线程 t1
synchronized(lock){
 while(i!=1){//需要用到条件不成立
 lock.wait(); 
}
}
//下面可能 有 t2 t3 等等别的任务线程
//这是第n个线程 tn
synchronized(lock){
 //唤醒等待中的线程
 i= 1;
lock.notifyAll();
}

这段代码的意思很清晰,如果有多个线程执行,但是每个线程需要一个条件才能执行,否则就没法往下进行,这时候我们可以用while进行循环判断,因为有可能t2 线程需要i=2的时候才能执行,而notify是随机唤醒一个,如果使用notify把t2唤醒了,发现 i=1 ,这就造成了资源浪费,所以建议采用notifyAll把所有线程唤醒,然后条件成立的继续执行,不成立的则进入下一轮的等待

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值