为什么wait(),notify(),notifyAll()必须在同步(Synchronized)方法/代码块中调用?

粗浅来说:

  1. wait(),notify(),notifyAll()是Java中一种多线程通信机制,通信机制最重要的便是等待通知/发送通知/收到通知,在这三者之间必须维持这样的顺序,才能使机制正常工作.
  2. 在多线程环境之中这样的顺序可能会遭到破坏,比如,a线程在完成自己一半任务后,下一半任务需要等待b线程的工作结果,才能正确完成所有任务,那么,正常操作就是a线程完成一半任务后调用 wait(),进入等待状态,b线程在完成任务后则调用notify()通知a线程可以继续工作,若两个线程不加同步,则可能出现a在调用wait()方法之前b线程已经调用了notify()方法,导致a线程在调用wait()后永远不会收到b线程的通知,无法正常完成工作.那这这个通信模型就没有什么用了,所以,要维持在多线程中这个通信机制正常工作,这几个方法必须位于同步块(临界区内),以有序的节奏执行.
  3. 综上简短来说,wait(),notify(),notifyAll()这样的多线程通信机制需要同步机制来保证三个方法在多线程中的调用的顺序以维持通信机制的正常工作,而Synchronized关键字所代表的则是java同步机制的实现.
  4. 另外,wait(),notify(),notifyAll()都是navtive方法,本身就是基于Synchronized关键字的多线程通信机制的实现.java中还有lock接口相关,是代码层面的同步实现,其中也有condition接口实现多线程的等待/通知通信机制.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值