有你在真好 的个人博客
互联网IT公司最易考,一个躲不开的程序员面试题,编写一个死锁
阅读:2271 添加日期:2021/3/27 23:27:14 原文链接:https://www.toutiao.com/item/6373628267307467265/

计算机程序编程中,当遇到多线程的问题时,我们要时刻保持着警惕,防止出现死锁,因为死锁的出现会让我们的程序停住不动,这是我们必须要解决的问题,也是我们在编程过程中坚决不能出现的问题,然而这个坚决不能出现的问题,却在许多计算机IT公司面试中经常出现,他们不仅不让你避免死锁,反而让你编程一个死锁,这是考验你对线程这方面的理解,所以这也是应该掌握的一个计算机IT公司的面试问题,下面我就用计算机代码的形式来给大家演示一下,如果您认为对您有用,欢迎您关注我们的头条号:趣IT科技

互联网IT公司最易考,一个躲不开的程序员面试题,编写一个死锁

思路

两个线程,两个锁(x,y),线程1握有x锁,线程2握有y锁,线程1需要y锁才能往下执行,线程2需要x锁才能往下执行,这样他们每人一把锁,这样就会出现死锁了,那么怎么可以让他们乖乖的拿到一把锁之后就不拿下一把,而是让另一个线程拿呢?可以做一个标志flag,通过他来指挥,下面就给大家用代码实现。

图片格式代码

互联网IT公司最易考,一个躲不开的程序员面试题,编写一个死锁

文本格式

package tset;

public class Lock1 implements Runnable {

public boolean flag;//做一个标记

Lock1(boolean flag){

this.flag=flag;}

private static Object o1 = new Object();//弄两个锁

private static Object o2 = new Object();

@Override

public void run() {

if (flag) { //有的实现方式是让线程睡一会,这里我们就不这么操作了

while(true){//,我们让他来回来去循环,肯定有死锁的一个时刻

synchronized(o1){

synchronized(o2){

System.out.println("趣IT科技呀呀呀呀呀");

}

}

}

}

else {

while(true){

synchronized(o2){

synchronized(o1){

System.out.println("趣IT科技啊啊啊啊啊啊啊");

}

}

}

}

}

public static void main(String[] args) {

Lock1 td1= new Lock1(true); //一个给true,这样他们执行if语句

Lock1 td2 = new Lock1(false); //一个给false,这样他们执行else语句

new Thread(td1).start(); //开启线程 //td1,td2都处于可执行状态,但JVM线程调度先执行哪个线程是不确定的。

new Thread(td2).start(); //td2的run()可能在td1的run()之前运行

}

}

运行结果

互联网IT公司最易考,一个躲不开的程序员面试题,编写一个死锁

大家可以看出程序停住不动了,所以说明死锁成功了,其实实现方法好多,原理也一样,如果你正好去计算机公司面试,正好遇到这个问题,可千万不要忘记正在辛苦码字的小编啊,欢迎关注我的头条号,每天分享一点进步一点。

互联网IT公司最易考,一个躲不开的程序员面试题,编写一个死锁

每天持续分享关于c语言,java,php,html的基本计算机编程小知识,欢迎您关注我们,一起交流,一起进步,每天进步一点点。欢迎收藏关注转发,喜欢您就点个赞吧!您的鼓励就是我们进步的动力。

您认为这道题考的多吗? 单选
0
0%
0
0%
不多

ICP备案号:苏ICP备14035786号-1 苏公网安备 32050502001014号