Java死锁

来源:互联网 发布:金融大数据研究院 编辑:程序博客网 时间:2024/05/16 15:10

开始写了一篇,写错了位置,显示的是乱码,现在重新来写:

先理解死锁:两个Thread或更多的Thread,都占用相同的行为,那么就要等待其他的用完了才能用,就像有两个人甲乙,甲在看报,而乙在玩游戏,那么甲就等着乙玩完了游戏后玩游戏(此刻甲还在看报),而已等着甲看完报后再看报(此刻已还在玩游戏),于是就这样僵持着,这就是死锁,互相等待着对方把事情做完。。。

现在看死锁代码:

 

 

class Zhangsan {

  public void say(){

 System.out.println("张三对李四说:“你给我画,我就把书给你“");

  }

  public void get(){

 System.out.println("张三得到画了");

  }

}

class Lisi {
   public void say(){
  System.out.println("李四对张三说:”你给我书,我就把画给你”");
   }
   public void get(){
  System.out.println("李四得到书了");
   }
}
public class ThreaDeadLock implements Runnable{
   private static Zhangsan zs=new Zhangsan();
   private static Lisi ls=new Lisi();
   private boolean flag=false;
   public void run(){
  if(flag){
  synchronized(zs){
  zs.say();
  try{
  Thread.sleep(500);
  }
  catch(InterruptedException e){
  e.printStackTrace();
  }
  synchronized(ls){
  zs.get();
  }
  }
  }else{
  synchronized(ls){
  ls.say();
  try{
  Thread.sleep(500);
  }catch(InterruptedException e){
  e.printStackTrace();
  }
  synchronized(zs){
  ls.get();
  }
  }
  }
   
           }
   public static void main(String[] args){
  ThreaDeadLock t1=new ThreaDeadLock();
  ThreaDeadLock t2=new ThreaDeadLock();
  t1.flag=true;
  t2.flag=false;
  Thread thA=new Thread(t1);
  Thread thB=new Thread(t2);
  thA.start();
  thB.start();
   }
}
------------------------------------------------------------------------------
更改run就解锁了:
  public void run(){
   if(flag){
        synchronized(zs){
        zs.say();
        try{
        Thread.sleep(500);
        }
        catch(InterruptedException e){
       e.printStackTrace();
         }
     }
  synchronized(ls){
       zs.get();
        }
  
       }else{
      synchronized(ls){
      ls.say();
      try{
      Thread.sleep(500);
      }catch(InterruptedException e){
      e.printStackTrace();
      }
    }
     synchronized(zs){
     ls.get();
      }
  }