前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用生活举例看Java多线程活跃性问题【死锁、饥饿、活锁】

用生活举例看Java多线程活跃性问题【死锁、饥饿、活锁】

作者头像
Java架构师必看
发布于 2021-05-14 09:24:54
发布于 2021-05-14 09:24:54
5480
举报
文章被收录于专栏:Java架构师必看Java架构师必看

死锁:吃饭问题,5个人每人只有一双筷子,只有让另外一个人分享他自己的筷子给自己,自己才能吃到饭。若存在这样的情况,若每个人都不把自己的筷子借给别人用餐,每个人都抓着自己手中的筷子不放,那么每个人都吃不上饭饿死了。也就是说A线程拥有B线程所需的资源,B线程也有A线程所需资源,但两者都不把资源分享出来,最后需求达不到,最后饿死。

饥饿问题:学校饭堂排队打饭,但有些人无秩序插队,那么插队的人拥有了更高的优先级,更可能打到饭吃,也可能他买上了饭也不离开,导致后面的人无法打饭。最后那些守规矩的人(优先级很低的人),就被饿死了。

引起饥饿问题的一些因素:

  1. 高优先级吞噬所有低优先级的CPU时间片
  2. 线程被永久堵塞在一个等待进入同步块的状态
  3. 等待的线程永远不被唤醒来

如果尽量避免饥饿问题:

设置合理的优先级,使用锁来代替synchronized

活锁:到达终点有两条路(记作1号路和2号路),有一对冤家A和B两人同时走了1号路,在途中相遇,他们俩看见了对方,于是都转身离开,A走了2号路,B也走了2号路,在行走的过程中,两人又再见碰面,于是又转身离开。后来A、B两人又同时走了1号路又再次碰面,就这样反反复复...这就是活锁问题

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java并发编程:死锁与活锁的区别,死锁与饥饿的区别?
Java 并发编程中,锁是避免并发冲突的重要机制,但如果使用不当,容易产生死锁和活锁等问题,甚至导致饥饿等高级问题。下面将对死锁、活锁以及饥饿这三个问题进行详细的介绍和区分。
用户1289394
2023/08/22
3300
Java并发编程:死锁与活锁的区别,死锁与饥饿的区别?
深入理解 Java 多线程核心知识:跳槽面试必备
多线程相对于其他 Java 知识点来讲,有一定的学习门槛,并且了解起来比较费劲。在平时工作中如若使用不当会出现数据错乱、执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题,所以掌握了解多线程至关重要。
小柒2012
2018/04/20
9430
深入理解 Java 多线程核心知识:跳槽面试必备
java高并发系列-第1天:必须知道的几个概念
接下来一个月,咱们一起啃下java高并发,欢迎留言打卡,一起坚持一个月,拿下java高并发。
路人甲Java
2019/12/10
8560
java高并发系列-第1天:必须知道的几个概念
你了解 Java 的各种锁吗?
安全性和活跃度通常相互牵制。我们使用锁来保证线程安全,但是滥用锁可能引起锁顺序死锁。类似地,我们使用线程池和信号量来约束资源的使用。
JavaFish
2019/10/17
6400
你了解 Java 的各种锁吗?
java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?
死锁、活锁、饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地执行下去了。 死锁 死锁是多线程中最差的一种情况,多个线程相互占用对方的资源的锁,而又相互等对方释放锁,此时若无外力干预,这些线程则一直处理阻塞的假死状态,形成死锁。 举个例子,A同学抢了B同学的钢笔,B同学抢了A同学的书,两个人都相互占用对方的东西,都在让对方先还给自己自己再还,这样一直争执下去等待对方还而又得不到解决,老师知道此事后就让他们相互还给对方,这样在外力的干预下他们才解决,当然
Java技术栈
2018/03/30
9410
计算机操作系统——锁的进化
相信大家都知道金鱼是不知道饥饿的,如果有食物吃,金鱼就会不停的填饱肚子,哪怕被撑死。在计算机中锁的进化可以用金鱼生存的例子来引入。
陌无崖
2020/07/27
5960
死锁、活锁、饥饿锁、无锁
死锁、活锁、饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地执行下去了。
一个会写诗的程序员
2020/05/26
2.1K0
JAVA并发之加锁导致的活跃性问题剖析
但是加锁也为我们带来了诸多问题 如:死锁,活锁,线程饥饿等问题 这一章我我们主要处理锁带来的问题. 首先就是最出名的死锁
Java宝典
2020/12/04
1.1K0
死锁、饥饿和活锁
死锁: 经典例子:“哲学家进餐”问题。 死锁的解决: 数据库服务器解决死锁:数据库系统中考虑了检测死锁和从死锁中恢复。当数据库服务器检测到死锁时(通常在表示等待关系的有向图中搜索循环),将选择一个牺牲者并放弃这个事务。作为牺牲者的事务会放弃它持有的所有资源,从而使其他事务继续执行。然后可以重新执行被强制终止的事务。 JVM解决死锁:JVM在解决死锁只能终止并重启。 死锁的产生: 锁顺序死锁: 两个线程试图以不同的顺序来获得相同的锁,那么就用可能发生死锁。 public class LeftRightLock
SuperHeroes
2018/05/31
1.3K0
Java并发编程实战 05等待-通知机制和活跃性问题
Java并发编程实战 01并发编程的Bug源头 Java并发编程实战 02Java如何解决可见性和有序性问题 Java并发编程实战 03互斥锁 解决原子性问题 Java并发编程实战 04死锁了怎么办
Johnson木木
2020/05/21
4900
Java多线程编程(三)一>详解synchronized, 死锁,wait和notify
synchronized 会起到互斥效果, 某个线程执行到某个对象的 synchronized 中时, 其他线程如果也执行 到同⼀个对象 synchronized 就会阻塞等待.
用户11305962
2024/11/21
1790
Java多线程编程(三)一>详解synchronized, 死锁,wait和notify
聊聊Java中的那些锁
说到Java中锁的分类,有很多种。本文就来聊聊公平锁、非公平锁、可重入锁、独占锁、共享锁和自旋锁。
贪挽懒月
2019/05/14
3320
聊聊Java中的那些锁
【Linux】:多线程(读写锁 && 自旋锁)
🔥 读写锁(Read-Write Lock)是一种用于多线程环境下同步访问共享资源的锁。它与传统的互斥锁(Mutex)有所不同,提供了更细粒度的控制,以便提高并发性能。它允许多个线程同时 读取 数据,但在写入数据时,必须确保只有一个线程可以进行写操作,并且在写操作期间,所有的读操作都必须等待。
IsLand1314
2024/12/20
2600
【Linux】:多线程(读写锁 && 自旋锁)
我是一个线程 0x3704
转自新浪博客,来自百度搜索。 原作者:2016-03-30 IBM刘欣 程序猿      我是一个线程, 我一出生就被编了个号: 0x3704,  然后被领到一个昏暗的屋子里, 这里我发现了很多和我一模一样的同伴。我身边的同伴0x6900 待的时间比较长, 他带着沧桑的口气对我说:我们线程的宿命就是处理包裹。 把包裹处理完以后还得马上回到这里,否则可能永远回不来了。我一脸懵懂,包裹,什么包裹?”不要着急,马上你就会明白了, 我们这里是不养闲人的。“        果然,没多久,屋子的门开了, 一个
霡霂
2018/06/04
8440
Python3 与 C# 并发编程之~ 线程篇3
在多线程程序中,死锁问题很大一部分是由于线程同时获取多个锁造成的,eg:一个线程获取了第一个锁,然后在获取第二个锁的 时候发生阻塞,那么这个线程就可能阻塞其他线程的执行,从而导致整个程序假死。
逸鹏
2018/09/07
4760
Python3 与 C# 并发编程之~ 线程篇3
Java并发编程与高并发解决方案
并发:同时拥有两个或者多个线程,如果程序在单核处理器上运行,多个线程将交替地换入或者换出内存,这些线程是同时“存在”的,每个线程都处于执行过程中的某个状态,高速切换感觉同时执行。如果运行多核处理器上,此时,程序中的每个线程将分配到一个处理器核上,因此可以真正的同时运行。
用户1212940
2022/04/13
1.1K0
Java并发编程与高并发解决方案
Java死锁、活锁,悲观锁、乐观锁
死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 
红目香薰
2022/11/29
4910
以生活例子说明单线程与多线程
在我看来单从程序的角度来看,一个好的程序的目标应该是性能与用户体验的平衡。当然一个程序是否能够满足用户的需求暂且不谈,这是业务层面的问题,我们仅仅讨论程序本身。围绕两点来展开,性能与用户体验。
哲洛不闹
2018/09/18
4350
以生活例子说明单线程与多线程
Java多线程-线程唤醒机制详解
创建一个顾客线程(消费者):告知老板要的包子的种类和数量,调用wait方法放弃cpu执行权,进入WAITTING状态;
訾博ZiBo
2025/01/06
660
Java多线程-线程唤醒机制详解
死锁与活锁的区别,死锁与饥饿的区别
死锁:是指两个或两个以上的进程( 或线程) 在执行过程中,因争夺资源而造成的一种==互相等待==的现象,若无外力作用, 它们都将无法推进下去。
鳄鱼儿
2024/05/21
1720
相关推荐
Java并发编程:死锁与活锁的区别,死锁与饥饿的区别?
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档