Java并发中死锁、活锁和饥饿是什么意思

 更新时间:2021年11月28日 14:43:07   作者:Shockang  
今天看到的一篇文章,说的很好,再敲了一遍,分享一下有关于死锁、活锁及饥饿的概念和区别,感兴趣的可以了解一下

解答

死锁是指两个或者两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,他们将无法推进下去。

如果线程的智力不够, 且都秉承着“谦让”的原则,主动将资源释放给他人使用,那么就会导致资源不断地在两个线程间跳动,而没有一个线程可以同时拿到所有资源正常执行。这种情况就是活锁。

饥饿是指某一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行。比如它的线程优先级可能太低,而高优先级的线程不断抢占它需要的资源,导致低优先级线程无法工作。 

补充

死锁

是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

产生死锁的原因

互相争夺共享资源

产生死锁的4大条件

1.互斥条件:共享资源被一个线程占用

2.请求与保持条件(占有且等待):一个进程因请求资源而被阻塞时,对已经获得资源保持不释放

3.不可剥夺条件(不可抢占):进程已获得资源,在未使用完之前,不能进行剥夺

4.循环等待条件:多个线程 循环等待资源,而且是循环的互相等待

死锁如何解决?

只需要破坏上面 4 个条件中的一个就能破坏。

1.请求与保持条件:放大锁范围,去除对资源的抢占

2.不剥夺:换成可重入锁ReentrantLock

3.循环等待:改成顺序加锁,避免循环等待

4.互斥是多线程的特性,所以这个条件无法避免

活锁

是指线程1可以使用资源,但它很礼貌,让其他线程先使用资源,线程2也可以使用资源,但它很绅士,也让其他线程先使用资源。这样你让我,我让你,最后两个线程都无法使用资源。活锁不会被阻塞,而是不停检测一个永远不可能为真的条件。除去进程本身持有的资源外,活锁状态的进程会持续耗费宝贵的CPU时间。

任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试、失败、尝试、失败。在这期间线程状态会不停的改变。

饥饿

是指如果线程T1占用了资源R,线程T2又请求封锁R,于是T2等待。T3也请求资源R,当T1释放了R上的封锁后,系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后,系统又批准了T4的请求......,T2可能永远等待。

这也就是ReentrantLock显示锁里提供的不公平锁机制(当然了,ReentrantLock也提供了公平锁的机制,由用户根据具体的使用场景而决定到底使用哪种锁策略),不公平锁能够提高吞吐量但不可避免的会造成某些线程的饥饿。

产生饥饿的原因

【即线程一直在等待却无法执行的原因】

1.高优先级线程抢占资源线程

2.在等待一个本身也处于永久等待完成的对象

3.线程被永久阻塞在一个等待进入同步块的状态,因为其他线程总是能在他之前持续地对该同步块进行访问(比如阻塞在synchronized)

活锁和死锁的区别

死锁会阻塞,一直等待对方释放资源,一直处在阻塞状态;活锁会不停的改变线程状态尝试获得资源。

活锁有可能自行解开,死锁则不行

 死锁活锁与饥饿的区别

进程会处于饥饿状态是因为持续地有其它优先级更高的进程请求相同的资源。不像死锁或者活锁,饥饿能够被解开。例如,当其它高优先级的进程都终止时并且没有更高优先级的进程到达。

 到此这篇关于Java并发中死锁、活锁和饥饿是什么意思的文章就介绍到这了,更多相关死锁、活锁和饥饿内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java使用注解实现防止重复提交实例

    Java使用注解实现防止重复提交实例

    这篇文章主要介绍了Java使用注解实现防止重复提交实例,在一些项目中由于用户误操作,多次点击表单提交按钮,会产生很多次的数据交互,为了解决这一问题,本文使用注解来实现防止重复提交,需要的朋友可以参考下
    2023-07-07
  • Spring Cloud调用Ribbon的步骤

    Spring Cloud调用Ribbon的步骤

    Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。本文将讲述Spring Cloud调用Ribbon的方法
    2021-05-05
  • Java实现的生成二维码和解析二维码URL操作示例

    Java实现的生成二维码和解析二维码URL操作示例

    这篇文章主要介绍了Java实现的生成二维码和解析二维码URL操作,结合实例形式分析了Java创建与解析二维码,以及文件读写等相关操作技巧,需要的朋友可以参考下
    2018-07-07
  • 玩转SpringBoot中的那些连接池(小结)

    玩转SpringBoot中的那些连接池(小结)

    这篇文章主要介绍了玩转SpringBoot中的那些连接池(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • java实现动态代理方法浅析

    java实现动态代理方法浅析

    这篇文章主要介绍了java实现动态代理方法浅析,很实用的功能,需要的朋友可以参考下
    2014-08-08
  • Java实现分布式系统限流

    Java实现分布式系统限流

    这篇文章主要为大家详细介绍了Java实现分布式系统限流,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • FastDFS分布式文件系统环境搭建及安装过程解析

    FastDFS分布式文件系统环境搭建及安装过程解析

    这篇文章主要介绍了FastDFS分布式文件系统环境搭建及安装过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Spring cloud Hystrix注解初始化源码过程解读

    Spring cloud Hystrix注解初始化源码过程解读

    这篇文章主要为大家介绍了Hystrix初始化部分,我们从源码的角度分析一下@EnableCircuitBreaker以及@HystrixCommand注解的初始化过程,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2023-12-12
  • Springmvc实现文件下载2种实现方法

    Springmvc实现文件下载2种实现方法

    这篇文章主要介绍了Springmvc实现文件下载2种实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • java生成图片验证码示例代码

    java生成图片验证码示例代码

    这篇文章主要为大家详细介绍了java生成图片验证码示例代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08

最新评论