Java线程间的通信之消费者和生产者

Java官方的API提供了几种线程间的通信方法

在经典的生产者和消费者模式中,一般可以有三种实现方式

1、suspend(挂起)和resume(唤醒),此套方法官方已经弃用,原因是容易出现死锁

     从而导致永久挂起,调用时需要注意先后顺序

2、wait(挂起)和notify(唤醒),在使用时必须在同步代码块中使用,并且需要注意先后顺序,

     反正会出现永久等待的问题

3、park(挂起)和unpark(唤醒)、使用时没有顺序要求,但是在使用时并不会释放锁资源

    所以在使用时不可用于同步锁中

最后需要注意的是:
使用if来判断是否进入状态是不正确的
官方更推荐使用循环来判断
原因是处于等待状态的线程可能会
收到错误警报和伪唤醒,
如果不在循环中检查等待条件,程序就会在没有
满足条件的情况下退出
所谓伪唤醒指的是并非因为notify、notifyall、unpark
等api调用而唤醒,而是更底层的原因导致的(Java操作的是虚拟机而不是直接操作CPU)

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值