出现此情况是因为每个对象都有线程锁,每个对象都锁了且不释放,这样所有带锁的对象就陷入了僵持状态,为了很好地演示此案例:这里举一个哲学家就餐问题,模拟出现死锁问题,然后我们在解决这个问题,为了解决死锁,需要给线程对象规定锁的时间,比如a线程锁3000毫秒就释放,这样其他线程就可以用到之前被锁过的线程了。 我们来说一说哲学家就餐问题,这是一个很奇怪的问题,先来描述一下:在我们的脑海中先浮现出一个正方形的桌子,然后桌子边儿上坐着4位哲学家,然后桌子的四个角放着四只筷子,这样就有三种情况: 1。四个人中有人得到了一双筷子 2。四个人中有人一双筷子也没有 3。四个人中人手一支筷子(死锁) 所以我们在执行此案例的代码时会出现这三种情况,在这里我们所要解释的是第三种情况。在这个例子中,总共出现两个做事情的对象,一个是筷子,一个是哲学家,筷子有编号,有四支筷子,有四个编号,哲学家在拿取筷子时按照编号拿,如图所示: 按照我们的拿取筷子要求,四位哲学家分别需要这样拿A:左2右1;B:左3右2;C:左4右3;D:左1右4 首先创建筷子对象,筷子有编号publicclassChopstick{筷子对象,没有业务逻辑,只是用来记录筷子编号用的privateintnum;目的是当哲学家们就餐时,按照编号拿取publicChopstick(intnum){this。numnum;}使用构造方法,为筷子赋值publicintgetNum(){returnthis。num;}} 有了筷子,那么我们的主角哲学家也该登场了publicclassPhilosopherextendsThread{这是一个哲学家类,他是一个线程,因为是四个哲学家一起,同时吃饭privateStringpname;哲学家的名字privateChopstickleft;哲学家左手边拿的筷子privateChopstickright;哲学家右手边拿的筷子privatelongtime;用于解决死锁所需要等待的时间通过构造方法告诉哲学家拿取几号筷子publicPhilosopher(Stringpname,Chopstickleft,Chopstickright,longtime){this。pnamepname;this。leftleft;this。rightright;this。timetime;}四位哲学家需要共同执行的规则publicvoidrun(){try{Thread。sleep(time);斯文的哲学家,规定好使用时间,避免了同时使用,发生死锁的情况}catch(InterruptedExceptione){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号筷子}}}} 那么在本案例中,死锁是怎么出现的呢?我们规定好所有哲学家先要拿左手边的筷子,再拿右手边的筷子,都拿完后再释放筷子对象,前提是左右手都有了筷子才释放,而死锁就是出现的这么巧,四个哲学家,四只筷子,每个哲学家左手人手一支,右手都没拿筷子,所以就都不释放,拿完左手的筷子后都在等待拿右手的筷子。于是就死锁了。publicstaticvoidmain(String〔〕args){创建主方法Chopstickc1newChopstick(1);给四只筷子对象一个编号Chopstickc2newChopstick(2);Chopstickc3newChopstick(3);Chopstickc4newChopstick(4);为了解决死锁,给哲学家ABCD设置吃饭时间,这样就不会抢了Philosopherp1newPhilosopher(哲学家a,c2,c1,0);Philosopherp2newPhilosopher(哲学家b,c3,c2,3000);Philosopherp3newPhilosopher(哲学家c,c4,c3,0);Philosopherp4newPhilosopher(哲学家d,c1,c4,3000);p1。start();p2。start();p3。start();p4。start();} 来看一下没有死锁的情况 有死锁的情况 笔者是一个正在学习后端知识的普通学者,年龄18,性别男。欢迎大家评论,提建议,讨论问题。