线程死锁 14

死锁 :

          多个线程各自占有些共享资源,并且互相等待其它线程占有的资源才能运行,而导致两个或者多个

          线程都在等对方释放资源,都停止执行的情景,某一个同步块同时拥有“两个以上对象的锁”时,就可能

          会发生“死锁”的问题。

  • 死锁避免方法:

                 1. 互斥条件:一个资源每次只能被一个进程使用。

                        2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

                        3. 不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。

                        4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

                     上面列出了死锁的四个必要条件,我们只要想办法破其中任意一个或多个条件就可以避免死锁发生

package Runnable1;
//死锁: 多个线程互相抱着对方需要的资源,然后形参僵持
public class Deadlock
{
   public static void main(String[] args) {
       Mateup g1=new Mateup(0,"灰姑娘");
       Mateup g2=new Mateup(1,"白雪公主");
       g1.start();
       g2.start();
  }
}
//口红
class Mouthred
{

}
//镜子
class Mirror
{
}
class Mateup extends Thread {
   //需要的资源只有一份,用static来保证只有一份
   static Mouthred mouthred = new Mouthred();//new一个镜子出来
   static Mirror mirror = new Mirror();

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

   Mateup(int choose, String girlName) {
       this.choose = choose;
       this.girlName = girlName;
  }

   @Override
   public void run()
  {
       //化妆
       makeup();
  }

   //化妆,互相持有对方的锁,就是需要拿到对方的资源
   private void makeup() {
       if (choose == 0) {
           synchronized (mouthred)//获得口红的锁     第一个人的情况,抱着口红的锁,想获得镜子的锁
          {
               System.out.println(this.girlName + "获得口红的锁");
               try {
                   Thread.sleep(1000);
              } catch (InterruptedException e) {
                   throw new RuntimeException(e);
              }
//               synchronized (mirror)//一秒中后想获得镜子锁镜子(锁) //会发生死锁
//               {
//                   System.out.println(this.girlName + "获得镜子的锁");
//               }
               
          }
           synchronized (mirror)//一秒中后想获得镜子锁镜子(锁)//避免死锁
          {
               System.out.println(this.girlName + "获得镜子的锁");
          }
      } else {
           synchronized (mirror)//获得镜子的锁               第二个人的情况,抱着镜子的锁,想获得口红的锁
          {
               System.out.println(this.girlName + "获得镜子的锁");
               try {
                   Thread.sleep(2000);
              } catch (InterruptedException e) {
                   throw new RuntimeException(e);
              }
//               synchronized (mouthred)//一秒中后想获得口红(锁) //会发生死锁
//               {
//                   System.out.println(this.girlName + "获得口红.的锁");
//               }
          }
           synchronized (mouthred)//一秒中后想获得口红(锁) //避免死锁
          {
               System.out.println(this.girlName + "获得口红.的锁");
          }
      }
  }
}
posted @ 2022-07-29 09:21  zjw_rp  阅读(13)  评论(0编辑  收藏  举报