java notify方法_java线程学习之notify方法和notifyAll方法

notify(通知)方法,会将等待队列中的一个线程取出。比如obj.notify();那么obj的等待队列中就会有一个线程选中并且唤醒,然后被唤醒的队列就会退出等待队列。活跃线程调用等待队列中的线程时,因为现在的活跃线程还用有锁,会先将synchronized代码块执行完毕,释放对象监视器,被唤醒的线程才会获得这个监视器,然后被唤醒的线程才能继续执行。也就是说原来在等待队列中的线程被唤醒后,在被执行notify的一瞬间并不会立刻执行,因为在被执行notify的一瞬间,原来执行notify的线程还持有着锁,所以其他线程还无法获取这个实例的锁。

举个例子:假设熊大和熊二都要到小黑屋里面壁十分钟,小黑屋同一时刻只能允许一只熊进行面壁思过。熊大先进开始面壁思过同时把门锁上(相当于执行synchronized代码块拥有锁),结果在熊大面壁到三分钟的时候,困了想去睡觉(相当于执行wait()方法,进去到等待队列),这时它走出了门(相当于释放锁)去睡觉,熊二开始进来进行面壁思过,当熊二面壁到6分钟的时候,喊了一声让熊大接着来面壁思过(相当于执行notify方法),因为熊二还在继续面壁思过,所以熊大要在小黑屋外一直等,等到熊二面壁结束后(释放了锁),才能进去接着面壁,面壁剩余的七分钟,所以说即使熊二在第6分钟叫醒了熊大,但因为此时熊二在小黑屋里,熊大也不可能第一时间面壁思过。

如果说等待队列中的线程不止一个,那么当执行notify的时候叫醒那一个呢,被唤醒的线程是随机选择的。那么被唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。

notifyAll(通知全部)方法是将等待队列中的所以线程都唤醒,用法和notify一样。区别是notify只能唤醒等待队列中的一个,而notifyAll却能唤醒等待队列中的全部。

在实际使用时,是使用notify还是notifyAll,那个更好呢。

因为notify唤醒的线程比notifyAll少,所以notify的处理速度会更快。

使用notifyAll的代码要比使用notify的代码更健壮,因为使用notify如果处理不好,程序便有可能终止。

wait() ,notify()和notifyAll()方法都要获得此对象的监视器,也就是要获得锁,否则会报

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值