多线程之死锁例子


//例: 小明和大大 吃水果    一个人同时有水果刀和水果  才能吃水果

//  如果小明拿到水果,而同时大大也拿到水果,则两个线程一直互相等待,造成死锁

//两个线程,小明和大大同时运行

package demo4;



public class DieLock extends Thread {


public void run(){
try{
            //判断当前线程名字是小明

if(Thread.currentThread().getName().equals("小明")){

                                //synchronized同步锁 当前代码只允许一个线程运行,当这个线程运行完,把“水果”锁归还,下个线程才能执行

synchronized ("水果"){
System.out.println("小明拿到水果了,准备拿水果刀");
//如果小明拿到“水果”锁,同时“水果刀”锁里面没有线程运行,则小明又去拿“水果刀”这把锁,同时拿到后,打印吃水果,若水果刀被下面大大拿到则小明一直等待
synchronized ("水果刀"){

System.out.println("小明拿到水果,也拿到水果刀,然后吃水果!");
}
}
}

else{      //如果不是线程小明就是大大

                                            //大大去拿“水果刀”锁

synchronized("水果刀"){

System.out.println("大大拿到水果刀了,准备拿水果!");

                                //若此时“水果”这把锁空闲 ,大大直接拿  ,则大大吃水果,  但是如果水果被小明拿到,而同时水果刀被大大拿到,则两个线程互相等待,造成死锁

synchronized ("水果"){
System.out.println("大大拿到水果刀,也拿到水果,然后吃水果!");
}
}
}

}catch(Exception e){
e.printStackTrace();
}

}

/**
* 死锁
* 怎么解决?没有办法解决
* 写多线程代码,一定要注意死锁问题

* 分析:
* 两把及两把以上的锁
* 两条及两条以上的线程

* 需要注意:
* 死锁不会出现内存溢出  死锁不耗费资源



*/
public static void main(String[] args) {

DieLock t1=new DieLock();
t1.setName("小明");
DieLock t2=new DieLock();
t2.setName("大大");
t1.start();//开启“小明”线程
t2.start();//开启“大大”对象


}

}



但是也有特殊情况就是“小明”这个线程抢先拿到“水果”和“水果刀”,if里面语句运行完了,“大大”这个线程这时也拿到“水果”和“水果刀”,但是这种出现的几率比较低,1000多次运行,可能出现一次,所以不做考虑,这便是一个多线程死锁的简单例子。 


猜你喜欢

转载自blog.csdn.net/yuanboqi/article/details/80185880