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

Posted 我是攻城师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于线程死锁,活锁和饥饿问题相关的知识,希望对你有一定的参考价值。

前言

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

关于死锁

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

举个真实世界的例子:

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

关于活锁

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

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

举个真实世界的例子:

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

关于线程饥饿

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

举个真实世界的例子:

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

如何解决

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

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

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