线程中的死锁问题
出现此情况是因为每个对象都有线程锁,每个对象都锁了且不释放,这样所有带锁的对象就陷入了僵持状态,为了很好地演示此案例:这里举一个哲学家就餐问题,模拟出现死锁问题,然后我们在解决这个问题,为了解决死锁,需要给线程对象规定锁的时间 ,比如a线程锁3000毫秒就释放,这样其他线程就可以用到之前被锁过的线程了。
我们来说一说哲学家就餐问题,这是一个很奇怪的问题,先来描述一下:在我们的脑海中先浮现出一个正方形的桌子,然后桌子边儿上坐着4位哲学家,然后桌子的四个角放着四只筷子,这样就有三种情况:
1.四个人中有人得到了一双筷子
2.四个人中有人一双筷子也没有
3.四个人中人手一支筷子(死锁)
所以我们在执行此案例的代码时会出现这三种情况,在这里我们所要解释的是第三种情况 。在这个例子中,总共出现两个做事情的对象,一个是筷子,一个是哲学家,筷子有编号,有四支筷子,有四个编号,哲学家在拿取筷子时按照编号拿,如图所示:
按照我们的拿取筷子要求,四位哲学家分别需要这样拿 A:左2右1 ;B:左3右2 ;C:左4右3 ; D:左1右4
首先创建筷子对象,筷子有编号public class Chopstick { //筷子对象,没有业务逻辑,只是用来记录筷子编号用的 private int num; //目的是当哲学家们就餐时,按照编号拿取 public Chopstick(int num){ this.num=num; } //使用构造方法,为筷子赋值 public int getNum(){ return this.num; } }
有了筷子,那么我们的主角----哲学家也该登场了public class Philosopher extends Thread{ //这是一个哲学家类,他是一个线程,因为是四个哲学家一起,同时吃饭 private String pname;//哲学家的名字 private Chopstick left;//哲学家左手边拿的筷子 private Chopstick right;//哲学家右手边拿的筷子 private long time;//用于解决死锁所需要等待的时间 //通过构造方法告诉哲学家拿取几号筷子 public Philosopher(String pname,Chopstick left,Chopstick right,long time){ this.pname = pname; this.left = left; this.right = right; this.time = time; } //四位哲学家需要共同执行的规则 public void run(){ /** *try { * Thread.sleep(time); * //斯文的哲学家,规定好使用时间,避免了同时使用,发生死锁的情况 * } catch (InterruptedException e) { * e.printStackTrace(); * } */ synchronized (left) {//锁住左手边的对象 System.out.println(this.pname+"拿起了左手边的"+this.left.getNum()+"筷子"); //例:A哲学家左手拿起了2号筷子, synchronized (right){//锁住右手边的对象 System.out.println(this.pname+"拿起了右手边的"+this.right.getNum()+"筷子"); //A哲学家右手边拿起了1号筷子 System.out.println(this.pname+"开始狼吞虎咽的吃起来啦"); //OK,执行完毕,释放被锁的2号和1号筷子 } } } }
那么在本案例中,死锁是怎么出现的呢?---->我们规定好所有哲学家先要拿左手边的筷子,再拿右手边的筷子,都拿完后再释放筷子对象,前提是左右手都有了筷子才释放,而死锁就是出现的这么巧,四个哲学家,四只筷子,每个哲学家左手人手一支,右手都没拿筷子,所以就都不释放,拿完左手的筷子后都在等待拿右手的筷子。于是就死锁了。public static void main(String[] args){ //创建主方法 Chopstick c1 = new Chopstick(1);//给四只筷子对象一个编号 Chopstick c2 = new Chopstick(2); Chopstick c3 = new Chopstick(3); Chopstick c4 = new Chopstick(4); //为了解决死锁,给哲学家ABCD设置吃饭时间,这样就不会抢了 Philosopher p1 = new Philosopher("哲学家a",c2,c1,0); Philosopher p2 = new Philosopher("哲学家b",c3,c2,3000); Philosopher p3 = new Philosopher("哲学家c",c4,c3,0); Philosopher p4 = new Philosopher("哲学家d",c1,c4,3000); p1.start(); p2.start(); p3.start(); p4.start(); }
来看一下没有死锁的情况
有死锁的情况
笔者是一个正在学习后端知识的普通学者,年龄18,性别男。欢迎大家评论,提建议,讨论问题。
华夏幸福新增51亿元债务违约,累计未偿还债务超420亿澎湃新闻记者刘畅产业新城运营商华夏幸福基业股份有限公司(华夏幸福,600340。SH)的违约债务如雪球般越滚越多。4月16日,华夏幸福发布关于公司及下属子公司部分债务未能如期偿还的
十四五,河北应以投资驱动,使经济重回前十名河北资本研究会会长李月政治家们都懂一个经济学的简单道理,加快经济发展最灵最快的办法是投资驱动。实现重要发展目标实施重大工程解决重大问题,化解严重困境,都必须依靠投资的力量。美东时间
大玩家登场,暴风TV的AI版图再下一城暴风Max6震撼发布2017年11月6日,暴风TV于北京丽都皇冠假日酒店举行了主题为大玩家的新品发布会,正式发布新品牌暴风AI无屏电视,推出首款产品暴风AI无屏电视Max6。目前暴风AI无屏电视Max
中高端配置起步新超级战神ZX7ZX8强势来袭游戏的不断更新迭代,对电脑配置的要求也不断提高。因此在游戏本的基础上很多厂商推出了更为高阶的游戏本来应对游戏高画质下对电脑高配置的要求,这种游戏本我们定义为电竞游戏本。神舟电脑作为
稳了!双11这波备战,影像巨头齐赴京东签约马上又要到一年一度的双11购(duo)物(shou)节啦,这个让人又爱又恨的双11,爱的是可以买到很多低于平常价格的商品,而钱包却要因此骨感不少,距离京东11。11全球好物节还有5
腕上时尚新体验HUAWEIWATCH2保时捷设计版4988元发布10月20日,HUAWEIWATCH2Pro与PORSCHEDESIGNHUAWEISmartwatch两款智能手表新品于上海正式与中国消费者见面。作为华为推出的具有跨时代意义的智
全力布局线上市场,vivo与京东合作擦出新火花!3月19日晚,声势浩大的vivoX21新品发布会在浙江乌镇举办,凭借领先的屏幕指纹技术全面屏外观以及JoviAI助理和众多人工智能应用,vivo掀起了2018年手机竞争的新一轮浪潮
沪深交易所审核通过首批9单基础设施公募REITs项目首批基础设施公募REITs项目获沪深交易所审核通过,共计9单。其中上交所5单,深交所4单。5月14日,上交所官网显示,首批5单基础设施公募REITs项目获审核通过,这标志着上交所基
卢龙县打造百亿元甘薯全产业链河北县域特色产业集群样本67卢龙县甘薯种植历史悠久,甘薯种植历史始于清咸丰年间,因当地土壤通透性好,富含钙磷钾铁锌等矿物质,非常适合甘薯生长。自清朝引种发展至今已有150多年历史。
挺进6。3元时代!人民币大幅升值为哪般?记者李金磊人民币升值挺进6。3元时代自今年4月份以来,人民币对美元汇率持续升值。5月26日,在岸人民币离岸人民币对美元汇率震荡上涨,截至发稿时,在岸人民币对美元汇率离岸人民币对美元
没油了!!末日来了吗?米色禾苗禾苗的北美生活下午在摇椅上被晃的昏昏欲睡,突然电话铃响了你车有油吗?电话那端传来朋友焦虑的声音。什么意思?我不会是在做梦吧。全城都没汽油了,到远一点的地方去加油。我刚在北边