在计算机程序编程中,当遇到多线程的问题时,我们要时刻保持着警惕,防止出现死锁,因为死锁的出现会让我们的程序停住不动,这是我们必须要解决的问题,也是我们在编程过程中坚决不能出现的问题,然而这个坚决不能出现的问题,却在许多计算机IT公司的面试中经常出现,他们不仅不让你避免死锁,反而让你编程一个死锁,这是考验你对线程这方面的理解,所以这也是应该掌握的一个计算机IT公司的面试问题,下面我就用计算机代码的形式来给大家演示一下,如果您认为对您有用,欢迎您关注我们的头条号:趣IT科技。
思路
两个线程,两个锁(x,y),线程1握有x锁,线程2握有y锁,线程1需要y锁才能往下执行,线程2需要x锁才能往下执行,这样他们每人一把锁,这样就会出现死锁了,那么怎么可以让他们乖乖的拿到一把锁之后就不拿下一把,而是让另一个线程拿呢?可以做一个标志flag,通过他来指挥,下面就给大家用代码实现。
图片格式代码
文本格式
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()之前运行
}
}
运行结果
大家可以看出程序停住不动了,所以说明死锁成功了,其实实现方法好多,原理也一样,如果你正好去计算机公司面试,正好遇到这个问题,可千万不要忘记正在辛苦码字的小编啊,欢迎关注我的头条号,每天分享一点进步一点。
每天持续分享关于c语言,java,php,html的基本计算机编程小知识,欢迎您关注我们,一起交流,一起进步,每天进步一点点。欢迎收藏关注转发,喜欢您就点个赞吧!您的鼓励就是我们进步的动力。
