Java-----多线程【死锁、案例 与 Lock锁】

死锁

  • 多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能运行,而导致两个或者多个线程都在等待对方释放资源,都停止执行的情形。某一个同步块同时拥有“两个以上对象的锁”时,就可能会发生“死锁”的问题。

死锁避免方法

  • 产生死锁的四个必要条件:

    1. 护持条件:一个资源每次只能被一个进程使用。
    2. 请求与保存条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
    3. 不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。
    4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

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

死锁与解锁实例:

public class TextDemo {      public static void main(String[] args) {          bb b1=new bb(0,"乔丹");         bb b2=new bb(1,"林丹");          b1.start();         b2.start();      } }  // 篮球 class basketball{  }  // 羽毛球 class badminton{  }  class bb extends Thread{     // 需要的资源只有一份,用static来保证只有一份     static basketball basketball = new basketball();     static badminton badminton = new badminton();      // 选择     int choice;     // 使用球的人     String grilnmae;      bb(int choice,String grilnmae){         this.choice = choice;         this.grilnmae = grilnmae;     }      @Override     public void run() {         // 打球         try {             bb();         } catch (InterruptedException e) {             e.printStackTrace();         }     }      private void bb() throws InterruptedException {         if(choice == 0){             synchronized (basketball){// 获得篮球的锁                 System.out.println(this.grilnmae+"获得了篮球");                 Thread.sleep(1000);                  synchronized (badminton){// 获得羽毛球队锁                     System.out.println(this.grilnmae+"获得了羽毛球");                 }             }         }else {             synchronized (badminton){// 获得羽毛球的锁                 System.out.println(this.grilnmae+"获得了羽毛球");                 Thread.sleep(2000);                  synchronized (basketball){// 获得篮球队锁                     System.out.println(this.grilnmae+"获得了篮球");                 }             }         }     } } 
Java-----多线程【死锁、案例 与 Lock锁】

这里已经产生死锁了,程序不会再往下运行,就一直卡在这里。

因为程序毕竟不是人,只会执行,不会思考。代码还需人打。

所以两个线程分别报了对方的锁,导致双方僵持不下,程序无法运行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MFdCJfSb-1617976936606)(D:学习tupian多线程线程同步s2.png)]

  • 解决方法如下:

    点击图片 放大观看

    Java-----多线程【死锁、案例 与 Lock锁】 Java-----多线程【死锁、案例 与 Lock锁】

Lock(锁)

版权声明:玥玥 发表于 2021-04-10 9:20:48。
转载请注明:Java-----多线程【死锁、案例 与 Lock锁】 | 女黑客导航