写在前面

本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见100个问题搞定Java并发

解答

死锁是指两个或者两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,他们将无法推进下去。如果线程的智力不够, 且都秉承着“谦让”的原则,主动将资源释放给他人使用,那么就会导致资源不断地在两个线程间跳动,而没有一个线程可以同时拿到所有资源正常执行。这种情况就是活锁。饥饿是指某一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行。比如它的线程优先级可能太低,而高优先级的线程不断抢占它需要的资源,导致低优先级线程无法工作。

补充

死锁

产生死锁的原因

互相争夺共享资源

产生死锁的4大条件

1.互斥条件:共享资源被一个线程占用
2.请求与保持条件(占有且等待):一个进程因请求资源而被阻塞时,对已经获得资源保持不释放
3.不可剥夺条件(不可抢占):进程已获得资源,在未使用完之前,不能进行剥夺
4.循环等待条件:多个线程 循环等待资源,而且是循环的互相等待

死锁如何解决?

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

1.请求与保持条件:放大锁范围,去除对资源的抢占
2.不剥夺:换成可重入锁ReentrantLock
3.循环等待:改成顺序加锁,避免循环等待
4.互斥是多线程的特性,所以这个条件无法避免

活锁

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

饥饿

产生饥饿的原因

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

1.高优先级线程抢占资源线程
2.在等待一个本身也处于永久等待完成的对象
3.线程被永久阻塞在一个等待进入同步块的状态,因为其他线程总是能在他之前持续地对该同步块进行访问(比如阻塞在synchronized)

活锁和死锁的区别

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

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

死锁、活锁和饥饿是什么意思?相关推荐

  1. java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?

    转载自 java多线程中的死锁.活锁.饥饿.无锁都是什么鬼? 死锁.活锁.饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地执行下去了. 死锁 死锁 ...

  2. 【无标题】线程学习(18)-多把锁下的线程问题,死锁,活锁,饥饿

    多把锁的应用 减小锁粒度,提交并发度. package com.bo.threadstudy.four;import lombok.extern.slf4j.Slf4j;/*** 多把锁的情况,以及后 ...

  3. mysql 活锁_Go语言死锁、活锁和饥饿概述

    本节我们来介绍一下死锁.活锁和饥饿这三个概念. 死锁 死锁是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状 ...

  4. 死锁、活锁、饥饿定位死锁解决死锁

    文章目录 1. 死锁 2. 定位死锁 2.1 jstack工具使用 2.2 jconsole工具使用: 3. 解决死锁 3.1 哲学家就餐问题 4. 活锁 4.1 活锁原因 4.2 活锁解决 5. 饥 ...

  5. 线程的死锁、活锁和饥饿现象

    目录 1.死锁 2.活锁 3.饥饿 一个资源应该单独使用一把锁. 比如,一个对象中有多个共享资源,但有多个线程需要使用其中的不同资源 此时如果把对象整体作为一把锁,那并发就很低. 可以考虑,把每个共享 ...

  6. 深耕Java多线程 - 死锁、活锁、饥饿

    文章目录 1. 什么是死锁? 2. 死锁产生的四个必要条件是什么? 3. 如何定位死锁? 3.1 jps+jstack 3.2 jconsole 4. 如何避免死锁? 5. 活锁 6. 饥饿 1. 什 ...

  7. 什么是死锁、活锁、饥饿?

    声明:尊重他人劳动成果,转载请附带原文链接!学习交流,仅供参考! 文章目录 1.死锁的概念以及危害 1.1 发生场景 1.2 概念 1.3 死锁的危害 1.4 死锁的四个必要条件 2.必然死锁的例子 ...

  8. java避免活锁.死锁的解决,死锁 活锁 饥饿 出现原因及解决方案

    文章目录 死锁 概念 死锁示例 为什么会出现死锁呢? 如何解决死锁呢? 解决死锁代码实现 活锁 概念 活锁示例: 如何解决活锁呢? 饥饿 概念 如何解决饥饿呢? 死锁 概念 死锁:一组互相竞争资源的线 ...

  9. 并发编程-锁的那些事儿【五:死锁,活锁,饥饿锁,锁优化】

    前言 经过前面几篇锁特性原理了解后,在面向实际使用场景会产生的问题,进行更深一步学习和解刨: 在前面的例子,都是用在synchronize关键字进行讲述,那么大家思考一个问题,在 中提到 " ...

最新文章

  1. Eclipe 新建maven web 项目
  2. pandas apply()函数参数 args
  3. 前端学习之day02-CSS基础
  4. ubuntu7.10 apache+php+mysql配置
  5. domain gap(域间隙)是什么?==>在一个数据集上训练好的模型无法应用在另一个数据集上
  6. python excel详解_Python - excel 详解
  7. 1981年长城一元硬币值钱吗?
  8. dumpe2fs命令详解
  9. php和python_c语言,python和c语言的主要区别
  10. 在Android studio环境下使用junit框架进行单元测试
  11. 复化科特斯公式matlab_牛顿
  12. 8个接私活的网站,只要你有码,那就有钱!
  13. C语言规定 程序中各函数之间_,C语言规定,程序中各函数之间________。 答案:既允许直接递归调用也允许间接递归调用...
  14. Java爬虫Jsoup爬取必应壁纸
  15. H5 AUI 使用总结
  16. 谷歌AI中国中心成立,人工智能势不可挡?
  17. java实现分数四则运算
  18. DIY人体红外报警器手机接收通知 防贼防盗防老王 物联网 智能家居
  19. 软件测试有哪些职业资格证书?
  20. 【渝粤题库】国家开放大学2021春2202公共行政学题目

热门文章

  1. 中国大豆产业的“退化”路径
  2. 计算机文化基础excel函数,《计算机文化基础(Windows XP版)》第4章Excel电子表格.ppt...
  3. Android 显示在某个位置下的菜单(Popwindow实现)
  4. 【Opencv学习】Image Thresholding
  5. C#实现仿QQ窗口靠边自动隐藏
  6. redis如何解决高可用问题?
  7. 产品经理枕边书:让产品与用户在交互的过程中上瘾
  8. 圆形梅花图片旋转特效
  9. 加密和认证,公钥和私钥,
  10. 5月跳槽会有风险,不跳也会有?