java 死锁和饥饿_死锁与活锁,死锁与饥饿的区别
一、定义:
1、死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
死锁发生的四个条件
(1)互斥条件:线程对资源的访问是排他性的,如果一个线程对占用了某资源,那么其他线程必须处于等待状态,直到资源被释放。
(2)请求和保持条件:线程T1至少已经保持了一个资源R1占用,但又提出对另一个资源R2请求,而此时,资源R2被其他线程T2占用,于是该线程T1也必须等待,但又对自己保持的资源R1不释放。
(3)不剥夺条件:线程已获得的资源,在未使用完之前,不能被其他线程剥夺,只能在使用完以后由自己释放。
(4)环路等待条件:在死锁发生时,必然存在一个“进程-资源环形链”,即:{p0,p1,p2,...pn},进程p0(或线程)等待p1占用的资源,p1等待p2占用的资源,pn等待p0占用的资源。(最直观的理解是,p0等待p1占用的资源,而p1而在等待p0占用的资源,于是两个进程就相互等待)
2、活锁:是指线程1可以使用资源,但它很礼貌,让其他线程先使用资源,线程2也可以使用资源,但它很绅士,也让其他线程先使用资源。这样你让我,我让你,最后两个线程都无法使用资源。活锁不会被阻塞,而是不停检测一个永远不可能为真的条件。除去进程本身持有的资源外,活锁状态的进程会持续耗费宝贵的CPU时间。
3、饥饿:是指如果线程T1占用了资源R,线程T2又请求封锁R,于是T2等待。T3也请求资源R,当T1释放了R上的封锁后,系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后,系统又批准了T4的请求......,T2可能永远等待。
这也就是ReentrantLock显示锁里提供的不公平锁机制(当然了,ReentrantLock也提供了公平锁的机制,由用户根据具体的使用场景而决定到底使用哪种锁策略),不公平锁能够提高吞吐量但不可避免的会造成某些线程的饥饿。
二、区别:
1、活锁与死锁的区别:活锁和死锁类似,不同之处在于处于活锁的线程或进程的状态是一直在不断改变的,活锁不会被阻塞,而是不停检测一个永远不可能为真的条件。除去进程本身持有的资源外,活锁状态的进程会持续耗费宝贵的CPU时间。活锁可以认为是一种特殊的饥饿。一个现实的活锁例子是两个 人在狭小的走廊碰到,两个人都试着避让对方好让彼此通过,但是因为避让的方向都一样导致最后谁都不能通过走廊。简单的说就是,活锁和死锁的主要区别是前者 进程的状态可以改变但是却不能继续执行。
2、死锁活锁与饥饿的区别:进程会处于饥饿状态是因为持续地有其它优先级更高的进程请求相同的资源。不像死锁或者活锁,饥饿能够被解开。例如,当其它高优先级的进程都终止时并且没有更高优先级的进程到达。
java 死锁和饥饿_死锁与活锁,死锁与饥饿的区别相关推荐
- mysql死锁 简单例子_写一个Mysql死锁的例子
创建表 CREATE TABLE `test1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(10) NOT NULL, PRIMAR ...
- java避免活锁.死锁的解决,死锁 活锁 饥饿 出现原因及解决方案
文章目录 死锁 概念 死锁示例 为什么会出现死锁呢? 如何解决死锁呢? 解决死锁代码实现 活锁 概念 活锁示例: 如何解决活锁呢? 饥饿 概念 如何解决饥饿呢? 死锁 概念 死锁:一组互相竞争资源的线 ...
- 深入并发线程、进程、纤程、协程、管程与死锁、活锁、锁饥饿详解
一.进程.线程.纤程.协程.管程概念理解 在现在你可能会经常看到进程.线程.纤程.协程.管程.微线程.绿色线程....一大堆xx程的概念,其实这些本质上都是为了满足并行执行.异步执行而出现的一些概念. ...
- Java多线程闲聊(二):活锁和死锁
Java多线程闲聊(二):活锁和死锁 这两个情况其实都是应该需要避免的情况,为了便于自己的回顾,我还是希望通过尽可能简单的表达来进行简要的归纳. 何谓死锁,就是正正紧紧按照Java的规范进行编程依然会 ...
- java线程死锁 cpu 100%_一文学会Java死锁和CPU 100% 问题的排查技巧
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开 工欲善其事,必先利其器 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在 ...
- java jstack 死锁_用jstack找死锁
java死锁主要依靠jstack命令来查找. 检测jstack 先配置好jdk环境变量,打开一个终端命令行,输入jstack回车.如果看到如下的字样,说明jstack是可用的. Usage: jsta ...
- 死锁是什么?死锁产生的条件?如何避免死锁?以及死锁的示例代码(Java代码)
文章目录 一.什么是死锁? 二.产生死锁的条件? 三.产生死锁的示例代码(java) 四.如何避免死锁? 一.什么是死锁? 下面图片参考 JavaGuide中的内容: 死锁的概念: 死锁:指的是相互两 ...
- mysql查询死锁的次数_一次神奇的MySQL死锁排查记录
一次神奇的MySQL死锁排查记录 发布时间:2020-08-29 00:50:26 来源:脚本之家 阅读:135 作者:咖啡拿铁 背景 说起Mysql死锁,之前写过一次有关Mysql加锁的基本介绍,对 ...
- 数据库原理 活锁死锁
1.封锁技术可以有效的解决并行操作一致性的问题,但是也带来了新的问题 活锁:某个事务被其它后来的事务抢占了,产生一直没有运行的现象 死锁:两个事务各自需要对方解决自己要操作的数据对象上的锁的权限,永久 ...
- 操作系统中的死锁_操作系统中的死锁介绍
操作系统中的死锁 1.1究竟什么是僵局? (1.1 What exactly is a deadlock?) In a multiprogramming environment, there may ...
最新文章
- php的闭包函数bingto_PHP 闭包那点事儿
- 多边形之间相交求交点的算法_路径规划算法总结
- jq设置html的fontsize,Jquery 设置字体大小(font-size)与行高(line-height)
- accept标头 php,如何在PHP中读取任何请求标头
- pycharm中windows找不到chrome解决办法
- Google Maps JavaScript API V3 官方网站
- python---django中form组件(1)简单使用和字段了解
- GitLab推动基于Kubernetes的Auto DevOps更新
- word 软换行与硬换行
- ZOJ - 4114 Flipping Game
- Linux的系统程序包管理
- ADS入门,使用ADS创建和仿真一个简单的线路
- aodv-uu 源码解读
- 使用svn报错之An error occurred while contacting the repository
- MEMS mic之Amic(一)
- 实验整理(一)——钓鱼邮件攻击实验
- html css超链接字体颜色,HTML-CSS设置超链接颜色字体
- 网络安全的魔法——社会工程学
- 华为Linux如何安装微信,华为手机怎么重新安装微信?
- Unity3D开发之折线图的制作(二)