跳转至

死锁

​ 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种**互相等待的现象**,若无外力干涉那它们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。

1566527468686

代码

package deadLock;

import java.util.concurrent.TimeUnit;

class HoldLockThread implements Runnable {
    private String lockA;
    private String lockB;

    public HoldLockThread(String lockA, String lockB) {
        this.lockA = lockA;
        this.lockB = lockB;
    }

    @Override
    public void run() {
        synchronized (lockA) {
            System.out.println(Thread.currentThread().getName() + "\t 持有 \t" + lockA + "\t 尝试获取\t" + lockB);
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (lockB) {
                System.out.println(Thread.currentThread().getName() + "\t 持有 \t" + lockB + "\t 尝试获取\t" + lockA);

            }
        }
    }
}

public class deadLockDemo {
    public static void main(String[] args) {
        String lockA ="LOCK_A";
        String lockB ="LOCK_B";
        //注意lockA和lockB的顺序
        new Thread(new HoldLockThread(lockA,lockB),"Thread_A").start();
        new Thread(new HoldLockThread(lockB,lockA),"Thread_B").start();
    }
}

证明是死锁

在Windows下操作:

  • jsp -l

cmd C:\Fs\java\untitled>jps -l 17344 120 com.intellij.rt.execution.application.AppMainV2 16904 org.jetbrains.jps.cmdline.Launcher 17180 jdk.jcmd/sun.tools.jps.Jps

可以看出120 com.intellij.rt.execution.application.AppMainV2是上面代码运行时使用的进程;

  • jstack 120 :进程号

```cmd //....前面省略 Java stack information for the threads listed above: =================================================== "Thread_A": at deadLock.HoldLockThread.run(deadLockDemo.java:24) - waiting to lock <0x0000000711c18090> (a java.lang.String) - locked <0x0000000711c18060> (a java.lang.String) at java.lang.Thread.run(java.base@12.0.2/Thread.java:835) "Thread_B": at deadLock.HoldLockThread.run(deadLockDemo.java:24) - waiting to lock <0x0000000711c18060> (a java.lang.String) - locked <0x0000000711c18090> (a java.lang.String) at java.lang.Thread.run(java.base@12.0.2/Thread.java:835)

```

可以看出:

Thread_A等待0x0000000711c18090已有0x0000000711c18060

Thread_B等待0x0000000711c18060已有0x0000000711c18090