一、suspend/resume
suspend/resume目前已经被弃用,java并不推荐使用该种方法,因为这种方法稍有不慎就很进入到死锁状态。
比如:
1、第一个线程在同步synchronized中调用suspend()进行等待,在另一个同步synchronized中调用resume()进行唤醒,但是由于同步锁的机制,拿到锁后挂起了,而另一个线程,要等到释放锁后才进行唤醒,这样就一直进入了等待,造成死锁。
2、resume在suspend之前执行,在执行suspend时,先进行了休眠,而就在休眠过程中,还没等执行suspend呢,就已经执行了resume进行了唤醒,也死锁了
二、wait/notify
这里一般常用的是这个,但是在使用该方法时要加上同步锁(不加锁会报错),与suspend/resume不同的是,虽然都加上了同步锁,但是在执行wait后,就会将锁释放,从而可以进行notify操作
但也同样有notify在wait前先执行的情况,也会产生死锁
三、park/unpark
这个方法就类似与许可的方式,就没有谁先执行的问题。
但是就不能添加同步synchronized锁了,否则也会进入死锁。