线程通讯(线程协作)

实现方式:

1.suspend【挂起】  resume【恢复执行】(被弃用)

问题:

a.不释放锁

b.对执行顺序要求严格

死锁情况A.同步代码中因为suspend不释放锁,resume也就获取不到锁,不能通知到suspend挂起的线程

死锁情况B.执行顺序不对容易死锁:多线程不确定性导致可能先执行了resume,而此时suspend由于在sleep没收到这个通知,就再也收不到通知去执行了)

2.wait  notify/notifyAll:不会死锁,因为线程调用wait方法后会释放锁

问题:

对执行顺序要求严格

基于监视器实现:

这些方法必须只能有同一个对象锁的持有者线程调用也就是写在代码块里,否则会抛出异常

wait方法导致当前线程等待,加入该对象的等待集合中,并且释放当前持有的对象锁

notify/notifyAll 唤醒一个/所有正在等待这个对象锁的线程

注意:虽然wait()自动解锁,但是对顺序有要求,如果在notify()之后才调用wait()方法,则线程永远处于wait状态

3.park()/unpark()

问题:

不释放锁

多次unpakr之后,再调用park,线程会直接运行,不会叠加

注意:不是监视器原理实现。所以在同步代码synchronlized(){}中容易死锁

====================================================================

以上三种方法,都没有完美解决所有问题,所有推荐用后两种酌情使用

 

suspend/resume正常调用

 

死锁情况1:

死锁情况2;

wait()/notify()

park /unpark

正常调用


多线程通讯的一些小陷阱

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值