多线程---死锁

死锁

 

 

 

 

 

 

package com.mokuiran.thread;

//死锁:多个线程狐仙抱着对方需要的资源,然后形成僵局
public class DeadLock {
   public static void main(String[] args) {
       Makeup m1 = new Makeup(0,"灰姑娘");
       Makeup m2 = new Makeup(1,"白雪公主");

       m1.start();
       m2.start();
  }
}
//口红
class Lipstick{

}
//镜子
class Mirror{

}

class Makeup extends Thread{

   //需要的资源只有一份,用static来保证只有一份
   static Lipstick lipstick = new Lipstick();
   static Mirror mirror = new Mirror();

   int choice;//选择
   String girlName;//使用化妆品的人

   public Makeup(int choice, String girlName) {
       this.choice = choice;
       this.girlName = girlName;
  }

   @Override
   public void run() {
       //化妆
       try {
           makeup();
      } catch (InterruptedException e) {
           e.printStackTrace();
      }
  }
   //化妆,互相持有对方的锁,就是需要拿到对方的资源
   private void  makeup() throws InterruptedException {
       if (choice==0){
           synchronized (lipstick){//获得口红的锁
               System.out.println(this.girlName+"获得口红的锁");
               Thread.sleep(1000);
               
                synchronized (mirror){//1秒后获得镜子的锁
               System.out.println(this.girlName+"获得镜子的锁");
          }
          }
         

      }else{
           synchronized (mirror){//获得镜子的锁
               System.out.println(this.girlName+"获得镜子的锁");
               Thread.sleep(2000);
                synchronized (lipstick){//2秒后获得口红的锁
               System.out.println(this.girlName+"获得口红的锁");
          }
          }
         
      }
  }
}

若要解除死锁,则:

   private void  makeup() throws InterruptedException {
       if (choice==0){
           synchronized (lipstick){//获得口红的锁
               System.out.println(this.girlName+"获得口红的锁");
               Thread.sleep(1000);
          }
           synchronized (mirror){//1秒后获得镜子的锁
               System.out.println(this.girlName+"获得镜子的锁");
          }

      }else{
           synchronized (mirror){//获得镜子的锁
               System.out.println(this.girlName+"获得镜子的锁");
               Thread.sleep(2000);
          }
           synchronized (lipstick){//2秒后获得口红的锁
               System.out.println(this.girlName+"获得口红的锁");
          }
      }
  }
 
posted @   默夔然  阅读(132)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示