死锁、活锁和饥饿是什么意思?
写在前面
本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和文献引用请见100个问题搞定Java并发
解答
死锁是指两个或者两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,他们将无法推进下去。如果线程的智力不够, 且都秉承着“谦让”的原则,主动将资源释放给他人使用,那么就会导致资源不断地在两个线程间跳动,而没有一个线程可以同时拿到所有资源正常执行。这种情况就是活锁。饥饿是指某一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行。比如它的线程优先级可能太低,而高优先级的线程不断抢占它需要的资源,导致低优先级线程无法工作。
补充
死锁
产生死锁的原因
互相争夺共享资源
产生死锁的4大条件
1.互斥条件:共享资源被一个线程占用
2.请求与保持条件(占有且等待):一个进程因请求资源而被阻塞时,对已经获得资源保持不释放
3.不可剥夺条件(不可抢占):进程已获得资源,在未使用完之前,不能进行剥夺
4.循环等待条件:多个线程 循环等待资源,而且是循环的互相等待
死锁如何解决?
只需要破坏上面 4 个条件中的一个就能破坏。
1.请求与保持条件:放大锁范围,去除对资源的抢占
2.不剥夺:换成可重入锁ReentrantLock
3.循环等待:改成顺序加锁,避免循环等待
4.互斥是多线程的特性,所以这个条件无法避免
活锁
任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试、失败、尝试、失败。在这期间线程状态会不停的改变。
饥饿
产生饥饿的原因
【即线程一直在等待却无法执行的原因】
1.高优先级线程抢占资源线程
2.在等待一个本身也处于永久等待完成的对象
3.线程被永久阻塞在一个等待进入同步块的状态,因为其他线程总是能在他之前持续地对该同步块进行访问(比如阻塞在synchronized)
活锁和死锁的区别
死锁会阻塞,一直等待对方释放资源,一直处在阻塞状态;活锁会不停的改变线程状态尝试获得资源。
活锁有可能自行解开,死锁则不行
死锁、活锁和饥饿是什么意思?相关推荐
- java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?
转载自 java多线程中的死锁.活锁.饥饿.无锁都是什么鬼? 死锁.活锁.饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地执行下去了. 死锁 死锁 ...
- 【无标题】线程学习(18)-多把锁下的线程问题,死锁,活锁,饥饿
多把锁的应用 减小锁粒度,提交并发度. package com.bo.threadstudy.four;import lombok.extern.slf4j.Slf4j;/*** 多把锁的情况,以及后 ...
- mysql 活锁_Go语言死锁、活锁和饥饿概述
本节我们来介绍一下死锁.活锁和饥饿这三个概念. 死锁 死锁是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状 ...
- 死锁、活锁、饥饿定位死锁解决死锁
文章目录 1. 死锁 2. 定位死锁 2.1 jstack工具使用 2.2 jconsole工具使用: 3. 解决死锁 3.1 哲学家就餐问题 4. 活锁 4.1 活锁原因 4.2 活锁解决 5. 饥 ...
- 线程的死锁、活锁和饥饿现象
目录 1.死锁 2.活锁 3.饥饿 一个资源应该单独使用一把锁. 比如,一个对象中有多个共享资源,但有多个线程需要使用其中的不同资源 此时如果把对象整体作为一把锁,那并发就很低. 可以考虑,把每个共享 ...
- 深耕Java多线程 - 死锁、活锁、饥饿
文章目录 1. 什么是死锁? 2. 死锁产生的四个必要条件是什么? 3. 如何定位死锁? 3.1 jps+jstack 3.2 jconsole 4. 如何避免死锁? 5. 活锁 6. 饥饿 1. 什 ...
- 什么是死锁、活锁、饥饿?
声明:尊重他人劳动成果,转载请附带原文链接!学习交流,仅供参考! 文章目录 1.死锁的概念以及危害 1.1 发生场景 1.2 概念 1.3 死锁的危害 1.4 死锁的四个必要条件 2.必然死锁的例子 ...
- java避免活锁.死锁的解决,死锁 活锁 饥饿 出现原因及解决方案
文章目录 死锁 概念 死锁示例 为什么会出现死锁呢? 如何解决死锁呢? 解决死锁代码实现 活锁 概念 活锁示例: 如何解决活锁呢? 饥饿 概念 如何解决饥饿呢? 死锁 概念 死锁:一组互相竞争资源的线 ...
- 并发编程-锁的那些事儿【五:死锁,活锁,饥饿锁,锁优化】
前言 经过前面几篇锁特性原理了解后,在面向实际使用场景会产生的问题,进行更深一步学习和解刨: 在前面的例子,都是用在synchronize关键字进行讲述,那么大家思考一个问题,在 中提到 " ...
最新文章
- Eclipe 新建maven web 项目
- pandas apply()函数参数 args
- 前端学习之day02-CSS基础
- ubuntu7.10 apache+php+mysql配置
- domain gap(域间隙)是什么?==>在一个数据集上训练好的模型无法应用在另一个数据集上
- python excel详解_Python - excel 详解
- 1981年长城一元硬币值钱吗?
- dumpe2fs命令详解
- php和python_c语言,python和c语言的主要区别
- 在Android studio环境下使用junit框架进行单元测试
- 复化科特斯公式matlab_牛顿
- 8个接私活的网站,只要你有码,那就有钱!
- C语言规定 程序中各函数之间_,C语言规定,程序中各函数之间________。 答案:既允许直接递归调用也允许间接递归调用...
- Java爬虫Jsoup爬取必应壁纸
- H5 AUI 使用总结
- 谷歌AI中国中心成立,人工智能势不可挡?
- java实现分数四则运算
- DIY人体红外报警器手机接收通知 防贼防盗防老王 物联网 智能家居
- 软件测试有哪些职业资格证书?
- 【渝粤题库】国家开放大学2021春2202公共行政学题目
热门文章
- 中国大豆产业的“退化”路径
- 计算机文化基础excel函数,《计算机文化基础(Windows XP版)》第4章Excel电子表格.ppt...
- Android 显示在某个位置下的菜单(Popwindow实现)
- 【Opencv学习】Image Thresholding
- C#实现仿QQ窗口靠边自动隐藏
- redis如何解决高可用问题?
- 产品经理枕边书:让产品与用户在交互的过程中上瘾
- 圆形梅花图片旋转特效
- 加密和认证,公钥和私钥,
- 5月跳槽会有风险,不跳也会有?