线程死锁

死锁


   小刘、小王在玩手机。小刘在用自己的手机打游戏,同时又想抢小王的手机看电视。这会小王正在拿自己手机打游戏,小王也想拿小刘的的手机看电视。小刘拿不到小王的手机,因为小王在打游戏,抢不走,所以小刘在打游戏的时候也在等待小王手机空闲下来。小王正在打游戏,小王也想拿小刘的手机看电视,但是这会小刘正在用着手机打游戏,所以小王抢不走。小刘的要求是,自己在玩手机的时候,还要拿小王的手机看电视。而小王的要求是,自己在玩手机的时候,要抢小刘的手机看电视。也就是说,小刘永远都等不到小王的手机,因为小王得不到小刘的手机,小王就永远不会停止,小王不会停止,小刘就会一直等待小王的手机,而小王也会一直等待小刘的手机,等啊等,等到死翘翘!

案例


   线程1启动,加锁占用了亚瑟,同时还想着独自占用鲁班;线程2启动,加锁占用了鲁班,同时还想着独自占用妲己;线程3启动,加锁占用了妲己,同时还想着独自占用亚瑟;形成闭环,死锁后不能停止。

  

 

  代码

package com.thread.thread14;

import com.thread.Hero;

public class TestThread {
    public static void main(String[] args) {
        final Hero yase = new Hero();
        yase.name = "亚瑟";
        final Hero luban = new Hero();
        luban.name = "鲁班";
        final Hero  daji = new Hero();
        daji.name = "妲己";

        Thread t1 = new Thread() {
          public void run() {   //线程执行
              //占有亚瑟
              synchronized (yase) {       //这里就占有了亚瑟
                  System.out.println("t1已经占有亚瑟");
                  try{
                      //停顿1000毫秒 另一个线程有时间占领亚瑟
                      ////因为我要用两个线程来看效果  一个已经占有了亚瑟 另一个准备来抢亚瑟  所以 不能让这个线程执行很快就结束
                      //我要留一点时间  等t1线程在占有时候  等t2过来抢
                      Thread.sleep(2000);
                  }catch(InterruptedException e) {
                      e.printStackTrace();
                  }
                  System.out.println("t1试图占有鲁班");
                  System.out.println("t1等待中");
                  synchronized(luban) {   //在占有亚瑟的同时  还要去抢鲁班   霸道
                      System.out.println("t1已经占有鲁班");
                  }
              }
          }

        };
        t1.start();  //启动t1线程
        Thread t2 = new Thread(){
          public void run() {
              //正在占有鲁班
              synchronized(luban) {
                  System.out.println("t2已经占有鲁班");
                  try{
                      //让这个线程运行的久一点  希望等的时间够久  让别个有时间来抢它的鲁班
                      Thread.sleep(2000);
                  }catch (InterruptedException e) {
                      e.printStackTrace();
                  }
                  System.out.println("t2试图占有妲己");
                  System.out.println("t2等待中");
                  synchronized (daji) {
                      System.out.println("t2已经占有妲己");
                  }
              }

          }
        };
        t2.start();

        Thread t3 = new Thread(){
            public void run() {
                //正在占有妲己
                synchronized(daji) {
                    System.out.println("t3已经占用了妲己");
                    try{
                        //让这个线程运行的久一点  希望等的时间够久  让别个有时间来抢它的鲁班
                        Thread.sleep(2000);
                    }catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("t3试图占有亚瑟");
                    System.out.println("t3等待中");
                    synchronized (yase) {
                        System.out.println("t3已经占有亚瑟");
                    }
                }
            }
        };
        t3.start();
    }

}

  效果

 

posted @ 2021-02-16 13:33  上天安排的最大嘛!  阅读(21)  评论(0编辑  收藏  举报