前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于线程死锁,活锁和饥饿问题

关于线程死锁,活锁和饥饿问题

作者头像
我是攻城师
发布2018-07-23 10:52:47
3.2K1
发布2018-07-23 10:52:47
举报

前言

上篇文章介绍了Java多线程里面最常见的死锁问题,其实除了死锁问题,这有两种问题虽然不常见,但是也需要我们了解一下,分别是线程活锁和线程饥饿。

关于死锁

这里简单在提一下,死锁是因为两个线程相互等待对方释放资源,但是他们又不会释放,从而造成程序永远不会终止。

举个真实世界的例子:

两个人在过独木桥,这个桥每次只能过一个人,死锁相当于两个人同时从对面上桥,走到中间的时候,谁都很强势,都在等待对方先退下去,让自己先过,但他们又都不退,从而造成僵死。

关于活锁

活锁与死锁恰恰相反,从字面上理解,死锁是因为两个线程相互等待此时他们的状态都是Blocked,因为阻塞住了所以可以理解成僵死。

活锁指的是,两个线程都是处于活越状态(Runnable),但是呢两个线程分别相互推脱任务,导致线程繁忙,最终程序无法继续向前运行。

举个真实世界的例子:

两个人在一个狭窄的胡同的相遇,但是呢两个人都很有礼貌,都彼此先让对方先过,所以一直同时从这边移到那边,从那边移到这边,虽然还在活动,但是却忙于彼此礼让对方,最终导致谁也不能干的别的事。

关于线程饥饿

线程饥饿问题其实指的公平性问题,意思是多个线程都在执行任务,但是只有一个cpu,如果想要大家都有机会执行自己的任务,那么必须是每个人执行一会之后,让出资源让别人执行,谁都不能一直占着cpu,如果某个线程一直占着cpu,那么造成的结果就是别的线程一直没有机会运行,从而导致饿死。

举个真实世界的例子:

每到过年的时候,大家都要买火车票回家,但是呢票的总数是有限的,当票一放出来的时候,黄牛通过不正当的方式,一下抢到了80%的票源,从而导致有很大一部分人买不到票,最后无奈要么不回家了,要么改换日期或者其他交通工具,这其实就是一个典型的公平性问题,公平指的是让人人都有机会而不是让某一个人垄断。

如何解决

(1)死锁的问题记住一个办法就是保持嵌套锁执行的顺序是一样的就可以

(2)活锁这里没有明确的解决办法,所以要依靠我们的设计,在coding过程避免类似的问题出现。

(3)饥饿的问题可以在线程代码中,加入wait(time)函数让一些线程可以主动让出一定时间资源给别的线程使用。

总结

本文主要介绍了线程里面的死锁,活锁,饥饿相关的问题,并介绍了一些避免的思路,死锁相比活锁和饥饿要更常见,但并不是说它们就不会出现在我们的多线程代码里,这里需要注意,最后上面的三种情况在Java里面的模拟例子,我已经上传到了我的github上面,感兴趣的朋友可以学习了解一下。

https://github.com/qindongliang/Java-Note

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我是攻城师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 关于死锁
  • 关于活锁
  • 关于线程饥饿
  • 如何解决
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档