Java官方的API提供了几种线程间的通信方法
在经典的生产者和消费者模式中,一般可以有三种实现方式
1、suspend(挂起)和resume(唤醒),此套方法官方已经弃用,原因是容易出现死锁
从而导致永久挂起,调用时需要注意先后顺序
2、wait(挂起)和notify(唤醒),在使用时必须在同步代码块中使用,并且需要注意先后顺序,
反正会出现永久等待的问题
3、park(挂起)和unpark(唤醒)、使用时没有顺序要求,但是在使用时并不会释放锁资源
所以在使用时不可用于同步锁中
最后需要注意的是:
使用if来判断是否进入状态是不正确的
官方更推荐使用循环来判断
原因是处于等待状态的线程可能会
收到错误警报和伪唤醒,
如果不在循环中检查等待条件,程序就会在没有
满足条件的情况下退出
所谓伪唤醒指的是并非因为notify、notifyall、unpark
等api调用而唤醒,而是更底层的原因导致的(Java操作的是虚拟机而不是直接操作CPU)