线程通信
1.文件共享
2.网络共享
3.共享变量
3.JDK提供的线程协调API(细分:suspend/resume,wait/notify/,park/unpark)
多线程协作的典型场景是:生产者-消费者模型。(线程阻塞,线程唤醒)
suspend和resume容易出现死锁代码(弃用):
1.在同步代码中,suspend不会释放锁。
2.如果resume早于suspend调用,则不会恢复线程继续执行。
wait/notify 只能由同一对象锁的持有者线程调用,要写在同步代码块里面。
wait会释放锁,notify/notifyAll不会释放锁。
notify/notifyAll不能早于wait调用,否则也会出现死锁。
park/unpark 等待许可/许可,不需要和同步代码块使用,如果一起使用,不会释放锁,容易出现死锁。
不要求park和unpark 的调用顺序,多次调用unpark后,再调用park,线程会直接运行
在线程代码中调用if语句进行判断,是否进入等待状态,是错误的
官方建议应该使用循环中检查等待条件,原因是处于等待状态的线程可能会收到错误的警报和伪唤醒,如果不在循环中检查等待条件,程序就会在没有满足条件的情况下退出。
伪唤醒是由更底层的原因导致的。