多线程之死锁例子
//例: 小明和大大 吃水果 一个人同时有水果刀和水果 才能吃水果
// 如果小明拿到水果,而同时大大也拿到水果,则两个线程一直互相等待,造成死锁
//两个线程,小明和大大同时运行
package demo4;
public class DieLock extends Thread {
public void run(){
try{
//判断当前线程名字是小明
if(Thread.currentThread().getName().equals("小明")){
//synchronized同步锁 当前代码只允许一个线程运行,当这个线程运行完,把“水果”锁归还,下个线程才能执行
System.out.println("小明拿到水果了,准备拿水果刀");
//如果小明拿到“水果”锁,同时“水果刀”锁里面没有线程运行,则小明又去拿“水果刀”这把锁,同时拿到后,打印吃水果,若水果刀被下面大大拿到则小明一直等待
synchronized ("水果刀"){
System.out.println("小明拿到水果,也拿到水果刀,然后吃水果!");
}
}
}
else{ //如果不是线程小明就是大大
//大大去拿“水果刀”锁
System.out.println("大大拿到水果刀了,准备拿水果!");
//若此时“水果”这把锁空闲 ,大大直接拿 ,则大大吃水果, 但是如果水果被小明拿到,而同时水果刀被大大拿到,则两个线程互相等待,造成死锁
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多次运行,可能出现一次,所以不做考虑,这便是一个多线程死锁的简单例子。