多线程死锁

写一个多线程死锁的例子

public class DeadLockDemo {

  public static final String lockA = "locka";
  public static final String lockB = "lockb";

  public void methodA() throws InterruptedException {
      synchronized (lockA){
        System.out.println("获取线程B方法"+Thread.currentThread().getName());
        //释放cup资源 但不释放锁
        Thread.sleep(200);
        synchronized (lockB){
          System.out.println("获取线程A方法"+Thread.currentThread().getName());
        }
      }
  }

  public void methodB() throws InterruptedException {
    synchronized (lockB){
      System.out.println("获取线程A方法"+Thread.currentThread().getName());
      Thread.sleep(200);
      synchronized (lockA){
        System.out.println("获取线程B方法"+Thread.currentThread().getName());
      }
    }
  }

  public static void main(String[] args) {
    DeadLockDemo deadLockDemo = new DeadLockDemo();
    new Thread(()-> {
      try {
        deadLockDemo.methodA();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }).start();
    new Thread(()-> {
      try {
        deadLockDemo.methodB();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }).start();

    System.out.println("主线程运行结束"+Thread.currentThread().getName());
  }

复制代码

发生死锁的原因

线程在获得了锁A并且没有释放的情况下去申请锁B,
这时另⼀个线程已经获得了锁B,在释放锁B之前⼜要先获得锁A
因此闭环发⽣,陷⼊死锁循环

死锁的4个必要条件
互斥条件:资源不能共享,只能由⼀个线程使⽤
请求与保持条件:线程已经获得⼀些资源,但因请求其他资源发⽣阻塞,对已经获得的资源保持不释
放
不可抢占:有些资源是不可强占的,当某个线程获得这个资源后,系统不能强⾏回收,只能由线程使
⽤完⾃⼰释放
循环等待条件:多个线程形成环形链,每个都占⽤对⽅申请的下个资源
只要发⽣死锁,上⾯的条件都成⽴;只要⼀个不满⾜,就不会发⽣死锁
复制代码

如何解决上面代码的死锁问题

public class DeadLockDemo {

  public static final String lockA = "locka";
  public static final String lockB = "lockb";

  public void methodA() throws InterruptedException {
      synchronized (lockA){
        System.out.println("获取线程B方法"+Thread.currentThread().getName());
        //释放cup资源 但不释放锁
        Thread.sleep(200);
      }
    synchronized (lockB){
      System.out.println("获取线程A方法"+Thread.currentThread().getName());
    }
  }

  public void methodB() throws InterruptedException {
    synchronized (lockB){
      System.out.println("获取线程A方法"+Thread.currentThread().getName());
      Thread.sleep(200);
    }
    synchronized (lockA){
      System.out.println("获取线程B方法"+Thread.currentThread().getName());
    }
  }

  public static void main(String[] args) {
    DeadLockDemo deadLockDemo = new DeadLockDemo();
    new Thread(()-> {
      try {
        deadLockDemo.methodA();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }).start();
    new Thread(()-> {
      try {
        deadLockDemo.methodB();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }).start();

    System.out.println("主线程运行结束"+Thread.currentThread().getName());
  }

}

复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享