没事儿写个死锁吧

237 阅读1分钟

什么是死锁:

  • 死锁的定义:死锁是指两个或两个以上的进程(线程)在运行过程中因争夺资源而造成的一种僵局(Deadly-Embrace),若无外力作用,这些进程(线程)都将无法向前推进。

死锁的几个结论:

  • 参与的进程数至少有2个
  • 参与死锁所有进程均等待资源
  • 参与死锁的进程至少有2个已经占有资源
  • 死锁进程是当前系统中进程集合的一个子集
  • 死锁会造成浪费大量的系统资源,甚至导致系统崩溃

实不相瞒,我开始在main()方法里调用getLock1getLock2,我还纳闷这俩方法兄弟咋不抢呢

方法:"都在主线程还整死锁呢"

其实说白了就是线程产生了竞态,线程同时持有与等待 我们创造这种条件即可

在程序中,我们让thread-1持有lock1,请求lock2

让thread-2持有lock2,请求lock1 即符合了同时持有和等待

public class ZDeadLock {

  private static final Object lock1 = new Object();

  private static final Object lock2 = new Object();

  public static void main(String[] args) {
    new Thread(
            new Runnable() {
              @Override
              public void run() {
                getLock1();
              }
            })
        .start();

    new Thread(
            new Runnable() {
              @Override
              public void run() {
                getLock2();
              }
            })
        .start();
  }

  public static void getLock2() {
    synchronized (lock1) {
      System.out.println("持有lock1,等待获取lock2..");
      synchronized (lock2) {
        System.out.println("获取到了lock2");
      }
    }
  }

  public static void getLock1() {
    synchronized (lock2) {
      System.out.println("持有lock2,等待获取lock1..");
      synchronized (lock1) {
        System.out.println("获取到了lock1");
      }
    }
  }
}

运行后果然是漫长的无限等待,再也获取不到了

此时打开jvisualvm,闪动并提示我们出现了死锁

此时线程dump会打印死锁的信息

了解了这些,下次程序中再出现死锁做到了知其所以然