三种线程协作通信的方式:suspend/resume、wait/notify、park/unpark的区别

一、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锁了,否则也会进入死锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值