//例: 小明和大大 吃水果    一个人同时有水果刀和水果  才能吃水果
//  如果小明拿到水果,而同时大大也拿到水果,则两个线程一直互相等待,造成死锁
//两个线程,小明和大大同时运行
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();//开启“大大”对象





}


}

android 多线程的死锁怎么导致的_死锁


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